표준 모듈 decimal을 보았습니까?
부동 소수점 동작을 우회합니다.
할 수있는 것을 설명하기 만하면됩니다.
0.00532
0.051960
0.0067124
2
0.05200
를 인쇄
import decimal
my_number = '0.00531'
mnd = decimal.Decimal(my_number)
print(mnd)
mnt = mnd.as_tuple()
print(mnt)
mnt_digit_new = mnt.digits[:-1] + (mnt.digits[-1]+1,)
dec_incr = decimal.DecimalTuple(mnt.sign, mnt_digit_new, mnt.exponent)
print(dec_incr)
incremented = decimal.Decimal(dec_incr)
print(incremented)
인쇄
0.00531
DecimalTuple(sign=0, digits=(5, 3, 1), exponent=-5)
DecimalTuple(sign=0, digits=(5, 3, 2), exponent=-5)
0.00532
또는 전체 버전 (편집도 어떤 자리를 운반, 그래서 그것은 또한 '0.199'
에서 작동 후) ...
from decimal import Decimal, getcontext
def add_one_at_last_digit(input_string):
dec = Decimal(input_string)
getcontext().prec = len(dec.as_tuple().digits)
return dec.next_plus()
for i in ('0.00531', '0.051959', '0.0067123', '1', '0.05199'):
print(add_one_at_last_digit(i))
부동 소수점은 10 진수로 내부적으로 표현되지 않지만 2 진수입니다. 결과적으로 '0.1'은 예를 들어 * 표현 가능 플로트가 아닙니다. 그것은'0.099999 ... ish 또는'0.1000 ...'ish와 근사치입니다. 그래서 그것은 대단히 불안정합니다. –
관련 : https://stackoverflow.com/questions/588004/is-floating-point-math-broken –
정말로 이것을 원한다면 float이 아닌 표현으로 전환해야합니다 (예 : 숫자와 함께 정수 소수 자릿수를 제공). –