为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript为什么浮点数会丢失精度

JavaScript为什么浮点数会丢失精度

一只斗牛犬 2018-11-25 00:00:36
JavaScript为什么浮点数会丢失精度
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

JS浮点计算问题

问题

用js进行浮点数计算,结果可能会“超出预期”,大部分计算结果还是对的,但是我们可不想在计算这么严谨的事情上还有意外的惊喜。比如:

  • 0.3 + 0.6 = 0.8999999999999999

  • 0.3 - 0.2 = 0.09999999999999998

  • 0.3 * 1.5 = 0.44999999999999996

  • 0.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.299999999999999988897769753748

  • 0.2转换后为0.200000000000000011102230246252

  • 0.299999999999999988897769753748-0.200000000000000011102230246252=0.099999999999999977795539507496

  • 这和js直接计算的结果0.09999999999999998想吻合。




查看完整回答
反对 回复 2018-12-22
  • 1 回答
  • 0 关注
  • 500 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信