js中的浮点数精度一般可以达到16位有效数字,因此有人使用parseFloat(x.toFixed(12))来提高js中浮点运算的精度。

经验证,这种方法当整数位数较少时基本正确,但对于较大或较小的运算结果是无效的,如1222.31*2344,直接运算结果是2865094.6399999997,parseFloat((1222.31*2344).toFixed(12))后仍然是2865094.6399999997,并未提升精度。

 

此时,应该先将结果归一化后再进行toFixed(12)这样的处理,可以保证12位有效数字,下面是对较大运算结果的处理:

function accurate(x) {
  var factor = Math.pow(10, Math.abs(x).toString().split('.')[0].length + 1);
  return (x / factor).toFixed(12) * factor;
}

accurate(1222.31*2344);

// 输出2865094.64

 

对于较小数,则需要找到其第一个非0的小数位(假设是小数点后第n位),然后先乘以一个10的n次方,然后toFixed(12),再除以10的n次方。