JavaScript 浮点数运算的精度问题 之解决办法bignumber.js

上一篇文章已经说了精度问题之原理 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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganggang4321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值