2010-02-12 73 views
3

可能重复:
Python float - str - float weirdness为什么在Python中划分2/5.0时出现错误?

在蟒蛇,2/5.02/float(5)回报0.40000000000000002

为什么我得到这个错误在最后,我怎样才能得到正确的值用于额外的计算?

+4

为了您的细读:*每个计算机科学家应该知道的关于浮点算术* http://docs.sun.com/source/806-3568/ncg_goldberg.html – 2010-02-12 09:52:31

+3

python教程解释:http:// docs。 python.org/tutorial/floatingpoint.html – nosklo 2010-02-12 10:43:47

+0

重复的DOZENS问题。请搜索。所有这些:http://stackoverflow.com/search?q=[python]+floating+point。具体来说这个:http:// stackoverflow。com/questions/1778368/python-float-str-float-weirdness – 2010-02-12 11:36:23

回答

22

欢迎使用IEEE754,enjoy your stay

改为使用decimal

+0

+1(链接到)对不幸事实的解释。并且有用的解决方案。简单地说。 – MattH 2010-02-12 09:47:50

+1

本节教程http://docs.python.org/tutorial/floatingpoint.html解释了这个问题,python的方式 – nosklo 2010-02-12 10:43:30

+8

使用'decimal'而不是可怕的建议。十进制数字具有**相同的问题**(例如,如果您试图表示2/3而不是2/5),但是'decimal.Decimal'与许多软件包不兼容,速度慢,语法上处理更多麻烦。 – 2010-02-12 17:02:05

1

查看this question的解释。正确的做法是要么

  1. 使用整数,直到“最终”计算
  2. 直播与舍入误差。
3

由于浮点运算不准确。您应该在您的额外计算中使用此值,并在完成后对结果进行四舍五入。如果您确切需要,请使用其他数据类型。

2

Ignacio上面有正确的答案。

IEEE标准有效地将浮点数存储到二进制计算机中。这些细节非常详细地介绍了数字的存储方式,几乎所有计算机都遵循这些规则。

他们也是错的。二进制数字不能处理大多数正常数字,只是两个幂。这些标准并没有做一些棘手的事情,而是要求重新计算底部位数来实现四舍五入或其他技巧,这些标准选择了效率。

这样,您可以诅咒您的系统运行速度稍快。偶尔有关于以某种方式改变Python以解决这些问题的争论,但是如果没有效率的巨大损失,答案也不是微不足道的。

四处逛逛此:

一种选择是挖掘到标准库的“十进制”包。如果你坚持这些例子,并忽略长页面,它会得到你想要的。没有效率的赌注。

其次是做一个手动舍入和字符串截断自己在一个输出函数。如果你从不打印这些数字,那么谁会关心这个数字是否有点偏离?

+4

使用'decimal'确实**没有解决这个问题。十进制数字不能再比二进制浮点数字表示所有的有理数。只需从2/5更改示例并将其替换2/3即可。 – 2010-02-12 19:29:46

2

请注意,Python 3.1有一个新的浮点格式化函数,可以避免这种外观。有关更多详细信息,请参见What's new in Python 3.1(搜索“浮点”)。

相关问题