Python float division “rounding error” on division by 100
在python2.7中将float除以100时,我得到以下"舍入行为":
1 2
| >>> 3.7e-03/100
3.7000000000000005e-05 |
我预计会出现以下情况:
1 2
| >>> 3.7e-03/100
3.7e-05 |
注意:
1 2 3 4
| >>> 3.7e-03/100 == 3.7e-05
False
>>> 3.7000000000000005e-05 == 3.7e-05
False |
虽然在大多数应用程序中可能没有实际的区别,但我发现这种行为有些令人不安。
为什么会发生这种情况,我怎么才能避免呢?
我使用的是python:'2.7.5水蟒1.7.0(32位)(默认,2013年7月1日,12:41:55)[msc v.1500 32位(intel)]
- 这是一个很好的解释stackoverflow.com/questions/5997027/…
- 如果你不分开会发生什么:即3.7E-03是什么?问题是计算机首先使用二进制,而10不是2的幂。第二,它们只有有限的字节,所以即使某些东西可以写成两个幂的总和,也可能由于缺少字节而导致舍入错误。
- 你可能想知道每个计算机科学家应该知道的关于浮点运算的知识。这是一个不依赖编程语言的一般性问题。
- @奇怪的是,3.7e-03停留在3.7e-03,或者更准确地说返回0.0037。3.7E-05停留在3.7E-05。只有3.7E-03/100导致了上述问题。这就是让我不安的地方。
这是众所周知的浮点数的缺陷。
你可以把二元浮点看成是两个分母幂的分数。即使是一个简单的数字,如0.1,也不能准确地表示为二进制浮点,而且每除以10的幂,本质上都是不准确的。
如果需要在python中使用任意分母进行精确划分,请使用Decimal(模拟铅笔和纸的小数)或Fraction(模拟铅笔和纸的分数)。
- 谢谢你给我指十进制。
- Decimal不支持任意分母。1/3没有精确的十进制结果。
- @EricPostischil感谢您的提示,但这对我的应用程序来说不是问题。上面提到的分数类型似乎对您提到的情况有所帮助。
- @ericPostischil Decimal支持任意分母,与铅笔和纸的十进制除法完全相同。所以,如果你用10的幂除,就像操作一样,结果是准确的。我敢打赌,如果Decimal(1) / Decimal(3)没有给出确切的结果,OP不会感到惊讶。
- @用户4815162342:您的回答指出,除以100的结果表明(二进制)浮点存在缺陷。在十进制中除以3没有什么不同;在同样的意义上,它是十进制算术的一个缺陷。
- @EricPostischil是的,"模拟铅笔和纸的小数"几乎暗示了这种缺陷。