JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案

JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案

您的语言没有中断,它正在执行浮点数学运算。计算机只能本地存储整数,因此它们需要某种表示十进制数字的方式。此表示并不完全准确。这就是为什么(通常不是)的原因 0.1 + 0.2 != 0.3。

为什么会这样呢?

  • 实际上,这很有趣。当您有一个以10为底的系统(如我们的系统)时,它只能表达使用该底数的质数的分数。10的素数是2和5。因此,由于分母都使用10的素数,所以1 / 2、1 / 4、1 / 5、1 / 8和1/10都可以清楚地表示。 / 3、1 / 6、1 /
    7和1/9都是重复的小数,因为它们的分母使用3或7的质数。
  • 在二进制(或以2为基数)中,唯一的质数是2,因此您只能清楚地表达分母只有2作为质数的分数。以二进制形式,1 / 2、1 / 4、1 /8都将干净地表示为小数,而1/5或1/10将重复小数。
  • 因此,在以10为基数的系统中,干净的小数点为0.1和0.2(1/10和1/5),是在计算机使用的以2为基数的系统中重复小数点。当您对这些重复的小数进行数学运算时,最终会剩下剩余的钱,这些剩余笔钱会在您将计算机的以2为底的(二进制)数字转换为更易于理解的以10为底的表示形式时保留下来…

以下是使用.1 + .2多种语言发送到标准输出的一些示例。
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第1张图片
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第2张图片
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第3张图片
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第4张图片

JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第5张图片
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第6张图片
JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第7张图片

JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第8张图片
今天在计算商品金额的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题0.1+0.2=0.3000000000004 那么,如何解决呢?

方案一:四舍五入法

  • 使用toFixed方法进行四舍五入也不是很精准,对于计算金额这种严谨的问题,不推荐使用
  
        console.log(parseFloat((0.1 + 0.2).toFixed(2)));//0.3

方案二:扩大倍数法

  • 把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。

JavaScript学习(六十四)—关于JS的浮点数计算精度问题解决方案_第9张图片

你可能感兴趣的:(【JavaScript】,javascript)