2013-05-15 47 views
0

Verison 2.6.5如果有帮助。 因此,我在django中做了一些东西,并从Floatfield获取了一个值。并将它与另一个floatfield进行比较。我们称之为2 X和Y. 当我运行它时,X最终会变成35.0。当我运行它时,Y最终以35.0结束。Python的浮点问题?

35.0 > 35.0 # False, ok no worries 
X > Y # True, why? 
round(X) > round(Y) # False, ok looks like i have to round it 

我知道浮动计算过程,但在这种情况下有问题,为35.0,所以我认为他们实际上是被35.0显示我的两个变量的值。这是否意味着python可能不会在float对象后面显示一些信息?我知道这是一个常见的问题,但如果它实际上是35.000000001什么的,python是不是显示整个值?

编辑:好的,最后通读这一点。浮点生活问题现在解决了我大声笑。 http://docs.python.org/2/tutorial/floatingpoint.html

+0

http://stackoverflow.com/questions/16551128/python-float-rounding-errors/16551150 –

+0

所以实际上,我还有一个问题。我知道会发生,但python不显示它? 35.0实际上意味着像35.000000000001? – dtc

+0

基本上......浮点不精确 –

回答

2

Python在打印/表示它们时有时会舍去浮点值*,但在比较它们时不会这样做。

试试这个:

'{:.17f} {:.17f}'.format(X, Y) 

(由于彩车刚刚超过17个的精度显著数字,您的号码范围[10, 100),打印17个数字应该足以看到所有存在的细节。但如果你不知道如何来计算的话,只是折腾一些额外位数:{:.64f}是完全合法的)

或者,你可以将它们转换为Decimal对象具有足够高的精度来表示区别,还是。许多其他的事情。

,或者最简单地说,X > YX是否比Y更大的一个很好的测试,如果这就是你真正想知道的。


对于现实生活中的代码,如果你想知道这是否是由于两种不同的计算两个浮点值是“相同的”,你不能这样做。理想情况下,你需要做适当的错误分析。如果不这样做,那么ε计算(如果您关心固定比例,则为abs(X-Y) < EPSILON,如果您不知道比例尺是什么,则为abs((X-Y)/(X+Y)) < EPSILON)通常足够好。但X == Y从来没有够好。


*不同Python版本的细节有所不同。例如,试试这个:

>>> str(1.000000000000001), repr(1.000000000000001) 

在Python 2.7,你会得到:

'1.0', '1.000000000000001' 

但是在Python 3。3:

'1.000000000000001', '1.000000000000001' 
+0

感谢您的明确解释。 – dtc

0

除了对像0这样已知精确字面值的简单测试外,不要在浮点数之间做简单的比较。

总是减去并测试看差异的绝对值是否低于epsilon。如果是这样,请将两个浮动视为平等。如果差异大于epsilon,则使用其符号来确定哪个大于另一个。

+0

好的谢谢,做X-Y帮助了我。当我显示X和Y时,它没有显示任何超过第一位小数的任何东西。 – dtc