js中的数值精度问题

    今天看到腾讯的一道面试题,js中的5*1.015是否等于5.075,答案当然是不等啦。还有0.1+0.2是否等于3等类似问题。

    在智能社的js视频中和《JavaScript高级程序》设计中,都有提到过这个问题。其实,当时我没太弄懂,就知道大概就是计算机储存近似处理的原因。后来查阅了更多资料,搞清楚了具体原因。现在总结如下。

    由于计算机的字长有限,进行数值计算的过程中,对计算得到的中间结果数据要使用“四舍五入”或其他规则取近似值,因而使计算过程有误差。这种误差称为舍入误差。(百度百科)

   而在计算机中我们知道,所有的数据都用二进制数字保存。当我们用十进制输入一个数字时,计算机自己其实会将它转换为二进制存储,在此过程中就有可能出现无限数字,此时计算机将根据精度舍弃后面的数字(这将导致小小的误差),在进行算术运算时,计算机实际上是用二进制进行计算,然后在将最后结果转换成十进制(此时误差将可能体现在此,注意:我用了可能)。原理现在知道了,那么我为什么用可能来形容呢?转换为十进制的最后结果因为数字不同(可能没有误差)、各种语言的规定的精度不同等原因,误差也不同。在计算时,如果误差偏小(在精度以外,已经进行舍入误差),或者是两个数字误差刚好互补(一正一负),或是计算后的误差偏小,则在转化后的十进制最终结果中不体现。所以,也就导致了我们说的题目问题的出现。

   在实际编程中,如果我们遇到了关于小数、除法等运算,请务必注意根据实际情况使用Math.round(),Math.floor(),Math.ceil(),等方法解决相关问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值