JavaScript中精度问题以及解决方案

在JavaScript中尽量避免浮点数直接进行计算,可以将浮点数转化为整数,之后进行计算

一、.toFixed()

toFixed() 方法使用定点数表示法来格式化一个数字,返回值为String类型。

该方法的舍入法则并不是四舍五入

而且,不同浏览器对 toFixed() 方法的处理结果是不同的。比如:(2.445).toFixed(2) 在IE中执行结果为2.45,但是在谷歌浏览器中的执行结果为2.44

二、Math.round()

Math.round()函数返回一个数字四舍五入后最接近的整数。他的舍入策略是:

  • 如果小数部分大于0.5,则舍入到下一个绝对值更大的整数。
  • 如果小数部分小于0.5,则舍入到笑一个绝对值更小的整数。
  • 如果小数部分等于0.5,则舍入到下一个正无穷方向上的整数

所以,对Math.round(-1.5),其结果为-1,这可能不是我们想要的结果。

但是,在实际场景中,往往需要处理的计算结果而不是字面量。问题就出在计算上,比如 2.445*100 的计算结果不是 244.5,而是244.49999999999997,这个时候再使用 Math.round() 方法,其结果自然和预期的就不一样了

console.log(Math.round(244.5));  // 245
console.log(Math.round(2.445 * 100));  // 244
console.log(2.445 * 100);  // 244.49999999999997

三、使用大整数进行计算来解决问题

结合上述两种方法,可以使用大整数进行计算来解决问题

(Math.round(2445 / 10) / 100).toFixed(2)    // "2.45"

四、第三方数字运算库

bignumber.jsdecimal.js,以及big.js

猜你喜欢

转载自blog.csdn.net/Wr2138/article/details/128400861