抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

在大部分编程语言中,小数的计算都有误差。比如js, number类型的整数数据使用64位二进制补码表示,可以表示的范围是-2^53 - 2^53,而浮点数是双精度64位二进制格式 IEE754, 任何使用IEE754标准的语言中都会有相同的问题。

如0.1,二进制中表示为0.00011001100110011……(无限循环),因此进行浮点数之间的计算时出现精度损失,出现0.1 + 0.2不等于0.3, 0.14 * 100不等于14的情况

如果应用中设计到金额之类的敏感数据, 尾差问题会导致比较严重的后果,金额对不上

要想解决这个问题, 可以将小数变成整数进行计算,然后转回小数就好了。

  1. 通过计算符号,先将浮点数的符号提取出来避免一些问题

  2. 使用toFixed将浮点数转化为字符串,并保留指定有效位数

  3. 对于一些精度不足的小数, 0.1 + 0.2会出现0.3000….4的结果。可以使用Math.round和Math.pow进行处理, 将小数转化为整数,再除以10的幂次方,再乘上幂次方即可

Math.signFigures = function(num, rank = 6) {
  if(!num) return(0);
  const sign = num / Math.abs(num);
  const number = num * sign;
  const temp = rank - 1 - Math.floor(Math.log10(number));
  let ans;
  if (temp > 0) {
      ans = parseFloat(number.toFixed(temp));
  }
  else if (temp < 0) {
      ans = Math.round(number / Math.pow(10, temp)) * temp;
  }
  else {
      ans = Math.round(number);
  }
  return (ans * sign);
};

用户交流区