目前我在 python 中编写了一个计算货币和许多其他东西的程序。现在我注意到浮点数上的IEEE-754
问题。
有没有办法在python中使用正确的值进行正确的数学运算?
例如:
0.1 + 0.1 + 0.1 = 0.3
我已经尝试了decimal
库,但似乎它没有在圆角处给我正确的圆形数字。
问候。
答案 0 :(得分:2)
使用decimal
模块时,需要使用字符串进行初始化;使用float
进行初始化将以高分辨率保留基础float
类型的不精确性。例如,使用Decimal(0.1)
实际上会产生一个值:
Decimal('0.1000000000000000055511151231257827021181583404541015625')
因为这是float
0.1
所代表的值的30位推断。
因此,不是测试Decimal(0.1) + Decimal(0.1) + Decimal(0.1) == Decimal(0.3)
(以固定的小数精度计算,而是使用非小数值初始化),而是使用Decimal("0.1") + Decimal("0.1") + Decimal("0.1") == Decimal("0.3")
,您将获得预期的结果。
除此之外,您还要调整decimal
上下文的.prec
属性以确保您保留预期的精确度,但通常是&# 39;可以保留完整的精度,然后使用quantize
方法将其精确地舍入到正确的精度。
答案 1 :(得分:1)
您是否尝试设置上下文?例如,下面的代码按预期返回0.3:
import decimal
decimal.getcontext().prec = 1
a = decimal.Decimal(0.1)
print(a + a + a)