Floating point addition in Python
为什么Python中的后一种情况不产生3.3的结果?
1 2 3 4
| >>> 1.0 + 2.3
3.3
>>> 1.1 + 2.2
3.3000000000000003 |
这对我来说似乎没有任何意义。对于您通过1.0 + 2.3而不是通过1.1 + 2.2获得的相同结果的表示,这里的限制是什么?
- 这是一个艰难的阅读,但这将帮助您了解正在发生的事情:docs.oracle.com/cd/e19957-01/806-3568/ncg_goldberg.html
- 浮点数通常不是小数的精确表示,而是近似值。要获得十进制数字的精确表示,请参见docs.python.org/2/library/decimal.html
- @詹森帕斯克:我想说,这是推荐阅读任何人都能在5公里,所以代表和怀疑这一点。
引用文档:
Unfortunately, most decimal fractions cannot be represented exactly as binary fractions. A consequence is that, in general, the decimal floating-point numbers you enter are only approximated by the binary floating-point numbers actually stored in the machine.
你偶然发现的是许多特性之一:
1 2 3 4 5 6
| >>> 1.1 + 1.1
2.2
>>> 1.1 + 2.3
3.4
>>> 1.1 + 2.2
3.3000000000000003 |
事实上,这是一个罕见的事件,我很难找到其他事件。这是另一个奇怪的例子:
1 2
| >>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17 |
使用python的decimal类可以获得更好的结果。
- 或十进制模块
- 我给了你+1,但在这里,numpy不是一个好的解决方案。numpy仍然使用二进制浮点数。decimal库将在这里提供一个精确的解决方案,因为decimal精确地操作十进制值。
- 我认为python通常只使用iee754,而numpy也可能使用。你能举个例子吗?也许你在想,例如,sympy.mpmath。
- +1用于0.1 + 0.1 + 0.1 - 0.3。
- @Steveha@Benjamin你们说得对。这是我的错误,我以为努比更精确,但事实证明并非完全正确。decimal更精确,但也不是那么精确。
- 好吧,numpy确实提供了几种浮点数,包括float64甚至float96。所以可以说它更精确。但任何二进制浮点表示都不能精确表示某些小数部分,如0.1。(0.5当然很容易用二进制浮点格式)换一种说法:你已经知道你不能用任何有限长度的十进制来表示1/7;不管你写了多少个十进制,你永远不会到达小数的末尾。好吧,二进制分数对一些十进制数字也有同样的问题。