js小数计算

  • 问题:
    • js在处理小数时存在精度问题

      在js 的计算中如果涉及到小数的运算,那结果可不要想当然了,比如 1.1+1.2 的计算

      var num1 = 0.1;
      var num2 = 0.2;
      var add = num1 + num2
      console.log(add)//0.3
      //正常答案应该是0.3 
      //实际上的结果是0.30000000000000004
      

  • 原因

    首先,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制

    0.1==>0.1.toString(2)==>0.0001100110011(无限循环…)

    0.2==>0.2.toString(2)==>0.001100110011(无限循环…)

    双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

  • 解决方法

    为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,大部分编程语言都是这样处理精度差异的,我们就借用过来处理一下 JS 中的浮点数精度误差。

var num1 = 0.001;
var num2 = 0.002;
var add = num1 + num2;
var digit = num1.split('.')[1].length;//3(小数点位数)
console.log(formatNum(add,digit));//0.003
function formatNum(f,digit) {
     
     
var m = Math.pow(10,digit);
return parseInt(f * m,10) / m;
}

Supongo que te gusta

Origin blog.csdn.net/publicman_/article/details/118936953
Recomendado
Clasificación