如何正确处理Python中的浮点运算?

时间:2019-04-04 13:29:52

标签: python python-3.x floating-point precision floating-accuracy

如何使用浮点数正确加减? 例如如何执行:

2.4e-07 - 1e-8

,以便它返回2.3e-7而不是2.2999999999999997e-07

首先转换为int会产生意外结果,以下返回2.2e-07

int(2.4e-07 * 1e8 - 1) * 1e-8

类似地,

(2.4e-07 * 1e8 - 1) * 1e-8

返回2.2999999999999997e-07

如何以8位小数点精度执行数字的减法和加法运算?

2.2999999999999997e-07是不够的,因为该数字用作字典中的查找,并且键是2.3e-7。这意味着2.3e-7以外的任何值都将导致错误的查找。

3 个答案:

答案 0 :(得分:1)

这实际上只是规避浮点算术问题的一种方法,但是我建议使用标准库中的decimal包。它使您可以进行精确的浮点数学运算。

使用您的示例

$ from decimal import Decimal
$ x = Decimal('2.4e-7')
$ y = Decimal('1e-8')
$ x-y
Decimal('2.3E-7')

值得注意的是,Decimal对象与内置的float不同,但它们大多数都是可互换的。

答案 1 :(得分:1)

我建议使用decimal数据类型(在Python的stardard安装中存在),因为它使用固定的精度来避免您在谈论的差异。

>>> from decimal import Decimal
>>> x = Decimal('2.4e-7')
>>> x
Decimal('2.4E-7')
>>> y = Decimal('1e-8')
>>> y
Decimal('1E-8')
>>> x - y
Decimal('2.3E-7')

答案 2 :(得分:0)

我不知道这是不是您想要的东西,但是您可以尝试这种事情:

a = 0.555555555
a = float("{0:.2f}".format(a))
>>> 0.56

希望它能对您有所帮助!

Adrien