【问题标题】:Python floating point issue? [duplicate]Python浮点问题? [复制]
【发布时间】:2013-05-15 09:59:38
【问题描述】:

版本 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

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

编辑:好的,终于通读了。浮点生活问题现在为我解决了,哈哈。 http://docs.python.org/2/tutorial/floatingpoint.html

【问题讨论】:

  • 所以实际上,我还有一个问题。我知道这会发生,但 python 不显示它? 35.0 实际上意味着类似 35.000000000001?
  • 基本上...浮点数不精确
  • 所以浮点数是不精确的,有时,python 甚至不会显示这种不精确性。因为我从 x 和 y 中得到 35.0 和 35.0。谢谢
  • @JoranBeasley:为什么不呢? print 35.000000000001 打印 35.0,即使 35.000000000001 == 35.0False

标签: python django


【解决方案1】:

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'

【讨论】:

  • 感谢您的明确解释。
【解决方案2】:

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

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

【讨论】:

  • 好的,谢谢,做 X-Y 对我有帮助。当我显示 X 和 Y 时,它没有显示任何超过小数点后的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2013-05-11
  • 2012-04-04
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多