为什么0.1 + 0.1 == 0.2?

时间:2017-11-25 10:46:00

标签: floating-point precision floating-accuracy

这与Java有关。根据我的理解,由于二进制表示,Java无法完美地表示0.1。这使得

0.1 + 0.1 + 0.1 == 0.3

假。但是,为什么

0.1 + 0.1 == 0.2

是真的吗?

1 个答案:

答案 0 :(得分:3)

  由于二进制表示,Java无法完美地表示

0.1。这使得

     

0.1 + 0.1 + 0.1 == 0.3

     

假。

这并不是平等为假的全部原因,尽管它是其中的一部分。 0.3也不完全是3/10。碰巧0.2恰好是0.1的两倍(虽然它们分别不是2/10和1/10),并且将0.1添加到自身产生的值也是{1}}键入常量0.2时会得到。另一方面,在操作0.1 + 0.1 + 0.1之后得到的整体近似值与将0.3与3/10分开的近似值略有不同。

如果我们使用带有5位有效数字的十进制数字,您可能会惊讶地发现1/3 * 3 == 1不成立(1/3计算为0.33333,而3时计算为0.99999,这与1),而1/4 * 4 == 1确实成立(1/4将计算为0.25,而4次计算为1)。

你的问题有点类似于此,但对于base-2计算。每个常数和操作都是近似的机会。有时近似值不会发生,有时它们会发生但会被取消,因此最终结果比您有权期望的更准确。在0.1 + 0.1的情况下,结果不是2/10,但它与写0.2时得到的2/10相同,因此等式成立。 0.1 + 0.1 + 0.1我们碰巧没有那么幸运。