如何使用浮点数正确加减?例如,如何执行:
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
以外的任何值都会导致不正确的查找。
我建议使用 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')
这实际上只是绕过浮点运算问题的一种方式,但我建议使用标准库中的decimal
包。它允许您执行精确的浮点数学运算。
以你为例,
$ from decimal import Decimal
$ x = Decimal('2.4e-7')
$ y = Decimal('1e-8')
$ x-y
Decimal('2.3E-7')
值得注意的是,Decimal
对象与内置float
不同,但它们大多是可互换的。
这是否是你要找的,但你可以尝试那种东西:
a = 0.555555555
a = float("{0:.2f}".format(a))
>>> 0.56
希望对您有所帮助!
阿德里安