蝴蝶不菲
JS浮点计算问题问题用js进行浮点数计算,结果可能会“超出预期”,大部分计算结果还是对的,但是我们可不想在计算这么严谨的事情上还有意外的惊喜。比如:0.3 + 0.6 = 0.89999999999999990.3 - 0.2 = 0.099999999999999980.3 * 1.5 = 0.449999999999999960.3 / 0.1 = 2.9999999999999996看完这几个计算结果,如果你没用过js,你可能会有点崩溃。我只能说,这就是js的魅力所在。分析在这之前,你需要知道以下几点:js中数字类型只有Number;js的Number是IEEE 754标准的64-bits的双精度数值网上有很多关于此问题的解释,由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而js中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失。其实高级语言(c#,java)也存在此问题,只不过它们自己内部做了处理,把这种精度差异给屏蔽掉了。有些小数转换为二进制位数是无穷的(有循环),但是64位中小数最多只有52位,因此对于位数超过的相当于被截取了,导致了精度的丢失。这个地址可以用来浮点数和IEEE 754标准的64-bits的互转(背后是二进制的转换),用这个我们来验证下0.3-0.2。0.3转换后为0.2999999999999999888977697537480.2转换后为0.2000000000000000111022302462520.299999999999999988897769753748-0.200000000000000011102230246252=0.099999999999999977795539507496这和js直接计算的结果0.09999999999999998想吻合。