【问题标题】:Why does python show 0.2 + 0.2 as 0.4?为什么 python 将 0.2 + 0.2 显示为 0.4?
【发布时间】:2015-07-01 22:44:57
【问题描述】:

我想我明白为什么 0.1 + 0.2 是 0.30000000000000004,但是遵循相同的逻辑为什么 0.2 + 0.2 = 0.4? 0.2 不是二进制数无法获得的值吗? 感谢您的宝贵时间。

【问题讨论】:

  • 其实是'0.40000000000000002220446049250313080847263336181640625'。默认表示仍为四舍五入。
  • @MartijnPieters 我认为您需要解释为什么 python 将其打印为 0.4。 python是否四舍五入到一定位数?
  • @MartijnPieters 感谢您的回答:为什么 python 将其四舍五入为 0.4 但不将 0.2 + 0.1 舍入为 0.3?
  • 另请注意,这“适用”任何形式的添加 x + x:例如,1.234 + 1.234 的结果将打印为 2.468。这本质上是因为如果x 是最接近实数v 的可表示二进制浮点数,那么(忽略溢出和次正规数)x + x 必须是最接近实数v + v 的可表示二进制浮点数。
  • @MarkDickinson 这也适用于次正规数。

标签: python floating-point


【解决方案1】:

要获得0.2,您需要将 2 的二进制小数相加。以下是前几个:

Decimal   Binary
1       = 1
0.5     = 0.1
0.25    = 0.01
0.125   = 0.001
0.0625  = 0.0001

所以,要得到 0.2,你需要求和

0.125
+ 0.0625 = 0.187500

下一个二进制小数是 0.03125。如果我总结一下,它太大了(> 0.2),下一个 0.015625 也是如此。下面一个,0.0078125就可以了,所以

0.125 + 0.0625 + 0.0078125 = 0.195312

等等。所以我们跳过了 0.5(给出 0)和 0.25(另一个 0),我们确实使用了 0.125 (1) 和 0.0625 (1)。同样,我们跳过了两个值 (00) 并使用了下一个 (1)...

但是,无论我们做什么,我们都不能用一个精确的二进制数来表示 0.2。我们必须继续,继续……如果我们不无限地继续,表示不完全是0.2……

现在试试 0.25 或 0.25...

现在为什么我们在现代 Python(>= 2.7 和 >= 3)中看到不同的东西,这来自内部变化:

在 Python 2.7 和 Python 3.1 之前的版本中,Python 对此进行了四舍五入 值为 17 位有效数字,给出“0.10000000000000001”。在 当前版本,Python 显示基于最短的值 正确四舍五入到真正二进制值的小数部分, 结果只是“0.1”。

this article,页面底部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2017-07-10
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多