正如您所注意到的,并非所有十进制数都可以完全表示为浮点数:
>>> 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')
由于您正在使用十进制数的属性,因此请使用该decimal
模块,它完全实现了它们:
from decimal import Decimal
def plus(n):
return n + Decimal('10') ** n.as_tuple().exponent
还有一个演示:
>>> n = Decimal('0.1239')
>>> plus(n)
Decimal('0.1240')
您必须将数字表示为字符串,因为将其表示为浮点数会失去精度。
缺点是 usingDecimal
将使您的plus
函数比使用浮点运算慢 20-30 倍,但这是精度的代价。