【问题标题】:Assignment of variables in Python - Strange behaviorPython中的变量赋值 - 奇怪的行为
【发布时间】:2012-05-07 19:29:46
【问题描述】:

我目前正在使用 Python 做一些事情,但在分配变量时会出现一些奇怪的行为。例如,我在 ipython 控制台中将“a”设置为 0.1:

In [1]: a = 0.1

然后我打印一个:

In [2]: a
Out[2]: 0.10000000000000001

In [3]: a == 0.1
Out[3]: True

In [4]: a == 0.10000000000000001
Out[4]: True

好吧,也许是因为数字的有限表示(最后一个 1 在第 16 位)。但后来:

In [17]: 1 == 0.10000000000000001
Out[17]: False

我必须为此感到害怕吗?因为我是 ! ;-)

【问题讨论】:

  • “也许是因为数字的有限表示” 是的! 1 == 0.10000000000000001(因此1 == 0.1)应该在哪个宇宙中为真?
  • this问题。
  • @NiklasB.:“我有必要被这个吓到吗?”
  • @Chris:我看到了 :) 关键是,“this”指的是什么? 1 != 0.1?如果不是,我宁愿害怕。
  • 这些内容记录在每一种使用浮点数的语言的手册中。现在还有人为自己读书吗?

标签: python variables variable-assignment


【解决方案1】:

查看 Python 教程的 Floating Point Arithmetic: Issues and Limitations 部分 - 您所描述的是浮点数据类型固有的怪异(没有特定于 Python)

另外,请注意repr()(字符串表示)以漂亮的四舍五入显示浮点数 - 您的第一个a 示例并不完全是0.1,如果您更精确地打印它可以看到:

>>> a
0.1
>>> print "%.50f" % a
0.10000000000000000555111512312578270211815834045410

【讨论】:

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

不,你不必害怕。这完全是非强制性的,我认为这是浪费能源,真的。

只要了解这个现象(你已经认识到它)并在必要时使用Decimal

【讨论】:

  • Awww...如果我是 Jon Skeet,我现在已经获得了 20 票。
  • 你必须回答相同的问题 C# 才能获得 20 票
  • 那么是人们仍然使用C#的原因吗?因为可能的选票,也许是与 Jon Skeet 竞争的快感?啊哈哈! Python 统治世界计划中的第一条:消灭 Jon Skeet!
猜你喜欢
  • 2012-12-16
  • 2015-04-01
  • 2016-06-01
  • 2011-04-08
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多