解决js运算精度丢失的插件bigjs
简述
当js
进行算术运算时,有时候会遇到以下几个问题:
// 控制台可以尝试以下代码
0.1 + 0.2 // 0.30000000000000004
0.3 - 0.1 // 0.19999999999999998
19.9 * 100 // 1989.9999999999998
为什么会遇到这个问题呢?
由于在计算机运算过程中,十进制的数会被转化为二进制来运算,有些浮点数用二进制表示是无穷的,浮点数运算标准(IEEE 754)64位双精度的小数部分最多支持53位二进制位,运算过程中超出的二进制位会被截断。运算完后再转为十进制。所以产生了精度问题。
为了解决此问题,整理了一些第三方的js
库。
js库名称 | 备注 |
---|---|
Math.js | JavaScript 和 Node.js 的扩展数学库 |
decimal.js | javaScript 任意精度的库 |
big.js | 一个轻量的任意精度库 |
本文主要着重讲一下big.js(比较轻量)
本次用的big.js
版本为6.2.1
浏览器引入
// 因为作为本地测试,就不下载压缩版本了
https://cdn.jsdelivr.net/npm/big.js@6.2.1/big.js
// 若需要压缩版本
https://cdn.jsdelivr.net/npm/big.js@6.2.1/big.min.js
<script src="./js/big.js"></script>
<script>
// 尝试Big构造方法
console.log('Big', Big)
</script>
npm安装
npm install big.js
import引入
// 现在一般用 es 模块引入
import Big from 'big.js';
使用
基本演示:
// 加
let a = new Big(0.1)
a = a.plus(0.2)
// 由于运算结果是个对象,所以展示以下值
console.log('a', a) // {s: 1, e: -1, c: Array(1)}
// 可以使用 Number || toNumber() 转为我们需要的数值
console.log('a', a.toNumber) || console.log('a', Number(a)) // 0.3
以链式调用:
x.div(y).plus(z).times(9)