if(3*0.1 == 0.3) =>false

关乎到浮点数在内存中表示的问题:

当使用了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

posted on 2019-03-10 00:05  植物大戰僵尸  阅读(385)  评论(2编辑  收藏  举报

导航