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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值