如何使用浮点数正确加减? 例如如何执行:
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
以外的任何值都将导致错误的查找。
答案 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