您可能希望重新了解 32 位和 64 位浮点表示的IEEE 浮点标准。如果您深入了解它的内部结构,您会清楚地看到为什么这些浮点会表现得如此挑剔。
如果您对它在内部的表示方式感到好奇(这就是它失败的原因),您可以使用这段代码,它显示了这些数字的十六进制表示。从那里,您可以将它们与单精度和双精度的指数和尾数相匹配。
System.out.printf("Float 10.0: 0x%X\n", Float.floatToRawIntBits((float)10.0));
System.out.printf("Double 10.0: 0x%X\n", Double.doubleToRawLongBits(10.0));
System.out.printf("Float 10.1: 0x%X\n", Float.floatToRawIntBits((float)10.1));
System.out.printf("Double 10.1: 0x%X\n", Double.doubleToRawLongBits(10.1));
印刷
Float 10.0: 0x41200000
Double 10.0: 0x4024000000000000
Float 10.1: 0x4121999A
Double 10.1: 0x4024333333333333
您会注意到值的表示方式存在一些重复。这是因为 1/10不能在以 2 为底的有限空间中表示。