这与Java有关。根据我的理解,由于二进制表示,Java无法完美地表示0.1。这使得
0.1 + 0.1 + 0.1 == 0.3
假。但是,为什么
0.1 + 0.1 == 0.2
是真的吗?
答案 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
我们碰巧没有那么幸运。