JavaScript数字精度问题总结
本文由 小茗同学 发表于 2018-01-05 浏览(3714)
最后修改 2025-09-09 标签:javascript 精度

常见错误

console.log(0.1+0.2); // 输出 0.30000000000000004
console.log(0.3-0.1); // 输出:0.19999999999999998
console.log(0.07*100); // 输出 7.000000000000001
console.log(8.8/100); // 输出 0.08800000000000001
console.log(1.335.toFixed(2)); // Chrome返回1.33,IE11返回1.34

相关文章:

成熟库

其中,前3个是同一个作者,体积一个比一个大,参见作者写的:big.js,bignumber.js和decimal.js有什么区别?

到底用哪个

  • big.js是一个极简的任意精度库,支持常见数学运算,一般诉求都能满足;
  • bignumber.js可能更适合金融应用程序,因为用户不必担心丢失精度,除非使用涉及除法的运算。
  • decimal.js可能更适合更科学的应用,因为它可以更高效地处理非常小或非常大的值。

前4个里面选一个的话,建议开发者直接用decimal.js,虽然部分功能可能用不到,但一共也才30kb,也不差这一点大小,除非你的页面对性能要求非常苛刻。

前面4个里面选一个的话,建议选big.js,除非你想要的功能它没有。

不过numeral.js也非常不错,开发者可以在numeral.jsdecimal.js里面选一个自己喜欢的。

最后一个 mathjs 是比较出名的专门处理数学计算的库,功能非常全,如果只是用来解决精度计算用这个库会显得杀鸡用牛刀,除了专门的数学运算场景一般不建议使用。

big.js 使用示例

注意,big.js的返回值必须toString()后才会返回数字。

import Big from 'big.js';

console.log(`${new Big(0.1).plus(0.2)}`); // 0.3
console.log(`${new Big(0.3).minus (0.1)}`); // 0.2
console.log(`${new Big(0.07).times(100)}`); // 7
console.log(`${new Big(8.8).div(100)}`); // 0.088
console.log(`${new Big(1.335).toFixed(2)}`); // 1.34

decimal.js 示例

new Decimal(0.1).plus(0.2).toString() // '0.3'
new Decimal(0.3).minus(0.1).toString() // '0.2'
new Decimal(0.07).times(100).toString() // '7'

toFixed的问题

见我的另外一篇文章:JavaScript的toFixed()方法的坑总结