精度问题原理及解决方法

题目:

var sum = 0.1+0.7

问题及解答:

1、打印的结果是什么?

结果:0.7999999999999999

2、为什么结果是这样?

前提:

  • 小数十进制转换为二进制,就是将小数×2取整数部分,一直循环计算取值,直到小数部分为0
  • 判断小数转换为二进制会产生无限循环一般条件:出现重复的,比如0.1的二进制是0.00011001100110011001...这里面就有重复的1001

原因:浮点数在计算机中是以二进制形式存储的,而某些十进制小数在转换为二进制时可能会无限循环,但由于计算机的资源是有限的。所以没办法用二进制精确的表示,只能确定一定的位数,例:单精度(32位),双精度(64位),然后在有限的精度情况下,最大化的接近该小数,但多多少少还是会造成一定的精度缺失

3、怎么做才能等于0.8?

  • // 通过乘法和除法运算
    var sum1 = (0.1*10 + 0.7*10) /10 
  •  sum.toFixed(1)最后结果是字符串,用parseFloat将其转化为浮点数
    var sum2 = parseFloat(sum.toFixed(1))    //确保结果为1位,并且遵循四舍五入,0.79999..保留一位小数,就是0.8(括号中为空的话,就是小数点后0位,默认四舍五入到整数)
     console.log(sum2);  

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

khatung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值