0

版本 2.6.5 如果有帮助。所以,我在 django 中做一些事情并从 Floatfield 中获取一个值。并将其与另一个浮动场进行比较。让我们称它们为 2 X 和 Y。当我运行它时,X 最终以 35.0 结束。当我运行它时,Y 最终以 35.0 结束。

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

4

2 回答 2

2

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

尝试这个:

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

(由于浮点数的精度刚刚超过 17 位有效数字,并且您的数字在范围内[10, 100),打印 17 位数字应该足以查看所有存在的细节。但如果您不确定如何计算它,只需折腾一些额外的数字:{:.64f}完全合法。)

或者,您可以将它们转换为Decimal具有足够高精确度的对象以表示差异或许多其他内容。

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


对于现实生活中的代码,如果你想知道两个不同计算产生的两个浮点值是否“相同”,你不能这样做。理想情况下,您需要进行适当的错误分析。如果做不到这一点,epsilon 计算(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'
于 2013-05-15T01:15:13.320 回答
0

除了针对已知精确字面量(如 )的简单测试外0,不要在浮点数之间进行简单比较。

始终减去并测试以查看差异的绝对值是否低于epsilon。如果是,则将两个浮点数视为相等。如果差值大于 epsilon,则使用其符号来确定哪个大于另一个。

于 2013-05-15T01:13:00.823 回答