解决JS精度丢失问题

JS经典问题:0.1+0.2!=0.3

 

 

 

 

为什么会造成精度丢失?

核心:因为JS遵守IEEE 754采用双精度存储,又因为JS最大位数是52位,最大数是2^53,而数字转成二进制时大于52位,后面的位数就会被舍弃,导致累加后就造成精度丢失。

 

解决方式

1.对结果进行解决

//number:结果(如:0.3111111)
//len:需要保留几位小数
function toFixed(number,len){
  //需要n位小数就乘以n倍
  const ceil = Math.pow(10,len);
  //加0.5是为了四舍五入
  const intNum = number*ceil+0.5;
  //再除以n倍
  const result = parseInt(intNum,10)/ceil;
  return result
}

 

2.对过程进行解决

  //frontNum 第一个数
  //endNum 第二个数
  //action 操作符
  function changeNumber(frontNum, endNum, action) {
    //数字转成字符串判断位数大小
    const maxLen = Math.max((frontNum + "").length, (endNum + "").length);
    //-2是因为存在"0"和"."
    const maxCeil = Math.pow(10, maxLen - 2);
    let result;
    if (action == '+') {
      result = ((frontNum * maxCeil) + (endNum * maxCeil)) / maxCeil;
    }
    //....除  减...
    return result
  }

 

posted @ 2022-02-18 13:16  飞飞飞飞0928  阅读(1292)  评论(1编辑  收藏  举报