浮动数字货币python

时间:2018-02-06 10:22:30

标签: python decimal

目前我在 python 中编写了一个计算货币和许多其他东西的程序。现在我注意到浮点数上的IEEE-754问题。

有没有办法在python中使用正确的值进行正确的数学运算?

例如:

0.1 + 0.1 + 0.1 = 0.3

我已经尝试了decimal库,但似乎它没有在圆角处给我正确的圆形数字。

问候。

2 个答案:

答案 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)