Python float - str - float怪异

问题描述:

>>> float(str(0.65000000000000002)) 

0.65000000000000002 

>>> float(str(0.47000000000000003)) 

0.46999999999999997  ??? 

这是怎么回事? 如何将0.47000000000000003转换为字符串并将结果值恢复为浮点型?Python float - str - float怪异

我在Windows上使用Python 2.5.4。

+1

解决这个问题,加入IEEE-754标签 – 2009-11-22 10:45:56

+3

RC:我认为许多人(是的,程序员也)不知道IEEE 754定义了浮点数(不是每个人都阅读语言规范:-))。所以我实际上认为“浮点”标签将是一个更好的选择,除非有关标准本身的具体问题。 – Joey 2009-11-22 11:01:31

+5

当然,那些提出这些问题的人不知道ieee-754是什么...... – sth 2009-11-22 11:30:26

str(0.47000000000000003)给出'0.47'float('0.47')可以是0.46999999999999997。 这是由于被表现的方式浮点数(见本wikipedia文章)

注:float(repr(0.47000000000000003))eval(repr(0.47000000000000003))会给你预期的结果,但是如果你需要的精度,你应该使用Decimal

+0

谢谢,很高兴知道! – Sharun 2009-11-22 10:59:49

+0

注意:在这里使用小数不仅用于精度,还用于精确性。 – Joey 2009-11-22 11:02:10

+0

我不确定,但我认为“精确”和“正确”是同义词,精度是通常的术语。 – tzot 2009-12-12 23:31:02

float(和double)不具有无限精度。当然,在对它们进行操作时会发生舍入错误。

这是一个Python FAQ

同样的问题出现quite regularly in comp.lang.python也。

我认为这是一个常见问题的原因是,因为python在所有其他方面都是完美的;我们期望它完美地执行算术 - 就像我们在学校教过的一样。然而,任何已经完成数值方法课程的人都会告诉你,浮点数与完美的距离很远。

Decimal是一个很好的选择,如果你想更快的速度和更多的选择gmpy是伟大的。

通过这个例子 我认为当你devide

>>> print(int(((48/5.0)-9)*5)) 
    2 

简单的方法,这是在Python中的错误,我这个

>>> print(int(round(((48/5.0)-9)*5,2))) 
    3