前言
在项目开发过程中发现浮点数的运算会出现精度问题,尤其是乘除运算。
产生浮点数计算精度不准确的原因: 在计算机角度,计算机算的是二进制,而不是十进制。二进制后变成了无限不循环的数,而计算机可支持浮点数的小数部分可支持到52位,所有两者相加,在转换成十进制,得到的数就不准确了,加减乘除运算原理一样。
十进制 二进制
0.1 0.0001 1001 1001 1001 ...
0.2 0.0011 0011 0011 0011 ...
0.3 0.0100 1100 1100 1100 ...
0.4 0.0110 0110 0110 0110 ...
0.5 0.1
0.6 0.1001 1001 1001 1001 ...
0.1+0.2会得到这么一串 0.0100110011001100110011001100110011001100110011001100因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
解决方案:
使用目前比较成熟的第三方库目前已经有了很多较为成熟的库,比如 bignumber.js,decimal.js,以及big.js等
big.js的简单使用
- 安装big.js
npm install --save big.js
- 页面上<script>标签内引用big.js
import Big from 'big.js'
- 常用操作
- 加法plus
console.log(0.1 + 0.2) //0.30000000000000004
let x
let y
x = Big(0.1)
y = x.plus(0.2) //0.3
- 减法
console.log(0.3 - 0.1) //0.19999999999999998
let x
let y
x = Big(0.3)
y = x.minus(0.1)
- 乘法
console.log(0.1 * 3) //0.30000000000000004
let x
let y
x = Big(0.3)
y = x.times(3) //0.9
- 除法
console.log(2/3) // 0.6666666666666666
let x
let y
x = Big(2)
y = x.div(3)
- 绝对值abs
let x
let y
x = Big(-0.8)
y = x.abs() // ‘0.8'
- 模运算mod
console.log(1 % 0.9) // 0.09999999999999998
let x
let y
x = Big(1)
y = x.mod(0.9) // '0.1'
网友评论