上一篇文章已经说了精度问题之原理 https://my.oschina.net/xiaogg/blog/2998192 也说了一些解决办法
今天我说一下新的方法
就是利用 bignumber.js 这个插件.我把这个插件应用到了买菜算的计算当中了
实例地址: http://tool.bitefu.net/jisuan/
买菜算源码下载:https://www.90pan.com/b1791720 密码:2e40
买菜算android下载: https://www.90pan.com/b1791721 密码:43vs
bignumber.js下载地址:https://www.90pan.com/b1791719 密码:r22l
bignumber.js开源地址: https://gitee.com/web/bignumber.js
简单用法如下
//加法函数
function accAdd(arg1,arg2){
var x = new BigNumber(arg1);
var y = new BigNumber(arg2);
return x.plus(y);
}
//减法函数
function accSub(arg1, arg2) {
var x = new BigNumber(arg1);
var y = new BigNumber(arg2);
return x.minus(y);
}
//乘法函数
function accMul(arg1, arg2) {
var x = new BigNumber(arg1);
var y = new BigNumber(arg2);
return x.multipliedBy(y);
}
//除法函数
function accDiv(arg1, arg2) {
var x = new BigNumber(arg1);
var y = new BigNumber(arg2);
return x.dividedBy(y);
}
看一下使用文档
文档
加法 plus
- 语法
.plus(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
0.1 + 0.2 // 0.30000000000000004
x = new BigNumber(0.1)
y = x.plus(0.2) // '0.3'
BigNumber(0.7).plus(x).plus(y) // '1'
x.plus('0.1', 8) // '0.225'
减法 minus
- 语法
.minus(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
0.3 - 0.1 // 0.19999999999999998
x = new BigNumber(0.3)
x.minus(0.1) // '0.2'
x.minus(0.6, 20) // '0'
乘法 multipliedBy
- 语法
.times(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
0.6 * 3 // 1.7999999999999998
x = new BigNumber(0.6)
y = x.multipliedBy(3) // '1.8'
BigNumber('7e+500').times(y) // '1.26e+501'
x.multipliedBy('-a', 16) // '-6'
除法 dividedBy
- 语法
.div(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
x = new BigNumber(355)
y = new BigNumber(113)
x.dividedBy(y) // '3.14159292035398230088'
x.div(5) // '71'
x.div(47, 16) // '5'
除法-取整 dividedToIntegerBy
- 语法
.idiv(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
x = new BigNumber(5)
y = new BigNumber(3)
x.dividedToIntegerBy(y) // '1'
x.idiv(0.7) // '7'
x.idiv('0.f', 16) // '5'
除法-取余 modulo
- 语法
.mod(n [, base])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字base
:number
进制 (默认为十进制)
- 返回值
BigNumber
- 参数值
- 举例
1 % 0.9 // 0.09999999999999998
x = new BigNumber(1)
x.modulo(0.9) // '0.1'
y = new BigNumber(33)
y.mod('a', 33) // '3'
指数运算 exponentiatedBy
- 语法
.pow(n [, m])
- 参数值
n
(必需):number|string|BigNumber
参与计算的数字m
:number|string|BigNumber
指数
- 返回值
BigNumber
- 参数值
- 举例
Math.pow(0.7, 2) // 0.48999999999999994
x = new BigNumber(0.7)
x.exponentiatedBy(2) // '0.49'
BigNumber(3).pow(-2) // '0.11111111111111111111'
开平方 squareRoot
- 语法
.sqrt()
- 举例
x = new BigNumber(16)
x.squareRoot() // '4'
y = new BigNumber(3)
y.sqrt() // '1.73205080756887729353'
四舍五入 toFixed
- 语法
.toFixed([dp [, rm]])
dp
(必需):number
保留小数位数rm
:number
- 举例
x = 3.456
y = new BigNumber(x)
x.toFixed() // '3'
y.toFixed() // '3.456'
y.toFixed(0) // '3'
x.toFixed(2) // '3.46'
y.toFixed(2) // '3.46'
y.toFixed(2, 1) // '3.45' (ROUND_DOWN)
x.toFixed(5) // '3.45600'
y.toFixed(5) // '3.45600'