关乎到浮点数在内存中表示的问题:
当使用了IEEE 754浮点数格式来存储浮点类型,都会有这种问题,正如在十进制中无法精确表示1/3,二进制也同样无法精确表示1/10,1/5等数值。
双精度浮点数(64位),使用1位符号位、11位指数位、52位尾数位来表示。因此,在64位浮点数情况下,对于十进制0.1:
=> 二进制0.00011001100110011...(循环0011) => 尾数为1.1001100110011001100...1100(共52位,除了小数点左边的1),指数为-4(二进制移码为00000000010),符号位为0 => 最终存储格式为:0 00000000100 10011001100110011...11001(尾数除去了小数点左边的1) => 因为尾数最多52位,所以实际存储的值为0.00011001100110011001100110011001100110011001100110011001
参考:here