在Python3中,
0.35 * 10
显示的结果与对10个数字的列表0.35
求和的结果不同。
Python 3.8.1 (v3.8.1:1b293b6006, Dec 18 2019, 14:08:53)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.35 * 10
3.5
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a)
3.5000000000000004
仅用Python3有可能克服这个精度误差吗?我的意思是不使用像 numpy 这样的库。
因此,如果您正在使用
math.fsum
对象列表,则在旧版本的 Python 上可用的一种方法是使用 float
。它比 sum
慢,但相当准确,所以,例如使用 python 3.8:
(py38) jarrivillaga-mbp16-2019:~ jarrivillaga$ python
Python 3.8.18 | packaged by conda-forge | (default, Dec 23 2023, 17:23:49)
[Clang 15.0.7 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a)
3.5000000000000004
>>> sum(a) == 0.35*10
False
但是,
>>> import math
>>> math.fsum(a)
3.5
>>> math.fsum(a) == 0.35*10
True
请阅读docs中的注意事项。
我相信 Numpy 也能做类似的事情。
另外,如果你可以升级到 CPython 3.12,他们实际上改进了内置的
sum
功能:
(py312) jarrivillaga-mbp16-2019:~ jarrivillaga$ python
Python 3.12.1 | packaged by conda-forge | (main, Dec 23 2023, 08:05:03) [Clang 16.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a) == 0.35*10
True