부동 소수점 숫자를 특정 소수점 자리로 반올림하는 방법은 무엇입니까?
내가 가지고 8.8333333333333339
있고 그것을 8.84
. 파이썬에서 어떻게이 작업을 수행 할 수 있습니까?
round(8.8333333333333339, 2)
제공 8.83
하지 않습니다 8.84
. 저는 Python 또는 일반적으로 프로그래밍을 처음 사용합니다.
문자열로 인쇄하고 싶지 않으며 결과가 더 많이 사용됩니다. 문제에 대한 자세한 내용은 Tim Wilson의 Python 프로그래밍 팁 : 대출 및 지불 계산기를 확인하십시오 .
8.833333333339
(또는 8.833333333333334
)의 결과는 106.00/12
소수점 이하 두 자리로 적절하게 반올림됩니다 8.83
. 수학적으로 당신이 원하는 것은 천장 함수 인 것처럼 들립니다 . Python math
모듈의 이름은 ceil
다음과 같습니다.
import math
v = 8.8333333333333339
print(math.ceil(v*100)/100) # -> 8.84
각각 바닥 및 천장 함수는 일반적으로 실수를 소수점 이하 자릿수가 0 인 가장 큰 이전 또는 가장 작은 다음 정수에 매핑합니다. 따라서 소수점 이하 두 자리에 사용하려면 먼저 숫자에 10 2 (또는 100)를 곱하여 소수점을 이동합니다. 포인트로 나눈 다음 나중에이를 보상합니다.
math
어떤 이유로 모듈 을 사용하지 않으려면 방금 작성한 다음 (최소한 테스트) 구현을 사용할 수 있습니다.
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
이것이 연결된 대출 및 지불 계산기 문제에 적용되는 방법
샘플 출력 에서 월별 지불액 을 반올림 한 것으로 보이며 , 이는 많은 사람들이 천장 함수의 효과라고 부르는 것입니다. 이 방법은 매월 조금 넘는 것으로 1 / 12 총량이 지불되고있다. 이로 인해 최종 결제 금액이 평소보다 약간 줄어들어 미결제 잔액은 8.76
.
월별 지불액 8.83
과 약간 더 높은 최종 지불액을 생성하는 일반 반올림을 사용하는 것도 똑같이 유효했을 것 입니다 8.87
. 그러나 현실 세계에서 사람들은 일반적으로 지불액이 올라가는 것을 좋아하지 않기 때문에 각 지불액을 반올림하는 것이 일반적인 관행입니다. 또한 대출 기관에 돈을 더 빨리 돌려줍니다.
8.83은 이진 부동 소수점으로 정확하게 표현 될 수 없기 때문에 이것은 정상입니다 (파이썬과 관련이 없습니다). 1/3이 십진수로 정확하게 표현 될 수없는 것처럼 (0.333333 ... ad infinitum).
절대 정밀도를 보장하려면 decimal
모듈 이 필요합니다 .
>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
decimal 모듈을 사용하고 싶지만 반올림 모드도 지정해야합니다. 예를 들면 다음과 같습니다.
>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>>
훨씬 간단한 방법은 단순히 round () 함수를 사용하는 것입니다. 여기에 예가 있습니다.
total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2
지금 total_price를 인쇄하면
3.9800000000000004
하지만 이렇게 round () 함수로 묶으면
print(round(total_price,2))
출력은 다음과 같습니다.
3.98
round () 함수는 두 개의 매개 변수를 받아 작동합니다. 첫 번째는 반올림하려는 숫자입니다. 두 번째는 반올림 할 소수 자릿수입니다.
8.8333333333339를 소수 2 자리로 반올림하면 정답은 8.84가 아니라 8.83입니다. 8.83000000001을 얻은 이유는 8.83이 이진수로 올바르게 표현 될 수없는 숫자이고 가장 가까운 숫자이기 때문입니다. 모두 0없이 인쇄하려면 VGE가 말한대로 수행하십시오.
print "%.2f" % 8.833333333339 #(Replace number with the variable?)
반올림하려면 8.84가 오답입니다. 반올림 된 8.833333333333은 8.84가 아니라 8.83입니다. 항상 반올림하려면 math.ceil을 사용할 수 있습니다. 부동 숫자 자체를 반올림하는 것은 의미가 없기 때문에 문자열 서식과 함께 두 가지를 모두 수행하십시오.
"%.2f" % (math.ceil(x * 100) / 100)
이를 수행하는 가장 쉬운 방법은 기본 제공되는 아래 함수를 사용하는 것입니다.
format()
예를 들면 :
format(1.242563,".2f")
출력은 다음과 같습니다.
1.24
비슷하게:
format(9.165654,".1f")
줄 것이다 :
9.2
기록만을 위해서. 다음과 같이 할 수 있습니다.
def roundno(no):
return int(no//1 + ((no%1)/0.5)//1)
포함 / 가져 오기가 필요 없습니다.
decimal
모듈 사용 : http://docs.python.org/library/decimal.html
ََََََ
반올림 / 내림 문제에 대한 해결책은 다음과 같습니다.
< .5 round down
> = .5 round up
import math
def _should_round_down(val: float):
if val < 0:
return ((val * -1) % 1) < 0.5
return (val % 1) < 0.5
def _round(val: float, ndigits=0):
if ndigits > 0:
val *= 10 ** (ndigits - 1)
is_positive = val > 0
tmp_val = val
if not is_positive:
tmp_val *= -1
rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
if not is_positive:
rounded_value *= -1
if ndigits > 0:
rounded_value /= 10 ** (ndigits - 1)
return rounded_value
# test
# nr = 12.2548
# for digit in range(0, 4):
# print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))
# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25
이 코드가 있습니다.
tax = (tax / 100) * price
그리고이 코드 :
tax = round((tax / 100) * price, 2)
라운드는 나를 위해 일했다
다음은이를 수행하는 간단한 기능입니다.
def precision(num,x):
return "{0:.xf}".format(round(num))
여기서 num은 10 진수입니다. x는 부동 숫자를 반올림하려는 위치까지의 10 진수입니다.
다른 구현에 비해 장점은 소수점 오른쪽 끝에 0을 채워서 소수점 이하 x 자리까지 deciaml 숫자를 만들 수 있다는 것입니다.
예 1 :
precision(10.2, 9)
돌아올 것이다
10.200000000 (소수점 9 자리까지)
예 2 :
precision(10.2231, 2)
돌아올 것이다
10.22 (소수점 2 자리까지)
'programing' 카테고리의 다른 글
VideoView를 사용한 원활한 비디오 루프 (0) | 2020.10.11 |
---|---|
모든 테이블 삭제 명령 (0) | 2020.10.11 |
WPF에서 안전하게 UI (기본) 스레드에 액세스 (0) | 2020.10.11 |
오류 : (6, 0) Gradle DSL 메서드를 찾을 수 없음 : 'google ()' (0) | 2020.10.11 |
`jupyter notebook` 실행시 오류 (해당 파일 또는 디렉토리 없음) (0) | 2020.10.11 |