BigNumber解决js基本运算精度问题
问题:今天在工作中发现了一个问题 0.07 * 100得到的不是7而是7.000000000000001,经过了解得知,浮点数在js中存储会转为双精度的二进制存储。比如0.1的二进制格式是:0.0001100011…。这是一个二进制无限循环小数,取前52位,所以一些小数存在计算机中天然就存在舍入误差。
解决方案:采用第三方库bigNumber.js来解决。
- 下载
import BigNumber from 'bignumber.js'
- 基于BigNumber在项目中封装基本的四则运算
// utils/math.js
import { BigNumber } from 'bignumber.js'
// 加
export function add(a, b) {
a = BigNumber(a)
b = BigNumber(b)
return a.plus(b).toNumber() // 结果需要用toNumber转为普通数字
}
// 减
export function subtract(a, b) {
a = BigNumber(a)
b = BigNumber(b)
return a.minus(b).toNumber() // 结果需要用toNumber转为普通数字
}
// 乘
export function multiply(a, b) {
a = BigNumber(a)
b = BigNumber(b)
return a.times(b).toNumber()
}
// 除
export function divide(a, b) {
a = BigNumber(a)
b = BigNumber(b)
return a.idiv(b).toNumber()
}
- 将封装好的方法在main.js中引入并且挂载到vue实例上
//main.js
// 导入加减乘除计算方法
import * as calc from './utils/math'
//挂载到实例上
// 挂载运算方法
Vue.prototype.$calc = calc
- 项目中使用
this.$calc.add(0.1,0.2) // 0.3
- BigNumber.js中还有许多实用的方法,有兴趣的可以去查阅了解