Java 使用 IEEE754 浮点数来处理它的浮点数和双精度数。本标准设计为无法准确表示以 10 为底的以 2 为底的数字。见这里http://en.wikipedia.org/wiki/IEEE_floating_point。
以下内容并不完全是标准,而是一个示例,只是为了让您了解为什么以 2 为基数的浮点数不适合其他基数。
基数 2 = 基数 10
0001 = 0001 -> 从 0*8 + 0*4 + 0*2 + 1*1
0010 = 0002 -> 从 0*8 + 0*4 + 1*2 + 0*1
0011 = 0003 -> 从 0*8 + 0*4 + 1*2 + 1*1
0100 = 0004 -> 从 0*8 + 1*4 + 0*2 + 0*1
0101 = 0005 -> 从 0*8 + 1*4 + 0*2 + 1*1
8 = 2^3, 4 = 2^2, 2=2^1 和 1 = 2^0
然后
基数 2 = 基数 10
.0000 = .0000 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0001 = .0625 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0010 = .1250 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0011 = .1875 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0100 = .2500 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0101 = .3125 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0110 = .3750 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.0111 = .4375 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1000 = .5000 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1001 = .5625 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1010 = .6250 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1011 = .6875 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1100 = .7500 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1101 = .8125 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1110 = .8700 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
.1111 = .9325 -> 从 0*1 + 0.5*0 + 0.25*0 + 0.125*0 + 0.0625*0
1 = 2^0, 0.5 = 2^-1, 0.25=2^-2 和 0.125 = 2^-3
如您所见。 4 位浮点数只能表示从 0 到 0.9325 的以 10 为基数的数字,间隙为 0.0625。这也意味着它不能做 0.1, 0.2, 0.3 ....
由于实际标准使用更多位以及使用数字移位技术。它实际上可以表示比这个例子更多的数字,但限制仍然相同。因此,当您划分某个值并且结果不属于其中之一时...JVM会将其移至最接近的值。
希望这能解释一下。