Jak zauważyłeś, nie wszystkie liczby dziesiętne mogą być reprezentowane dokładnie jak pływaków:
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')
>>> Decimal(0.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(0.5)
Decimal('0.5')
Ponieważ pracujemy z właściwościami liczb po przecinku, użyj modułu decimal
, który realizuje je dokładnie:
from decimal import Decimal
def plus(n):
return n + Decimal('10') ** n.as_tuple().exponent
A demo:
>>> n = Decimal('0.1239')
>>> plus(n)
Decimal('0.1240')
Y Musimy reprezentować liczbę jako łańcuch, ponieważ reprezentowanie jej jako liczby zmiennoprzecinkowej straci dokładność.
Wadą jest to, że użycie Decimal
spowoduje, że funkcja będzie działać około 20-30 razy wolniej niż w przypadku operacji zmiennoprzecinkowych, ale to jest koszt precyzji.
To jest niesamowite pytanie. Dzięki, że pytasz. – zsong