js 数值精确运算使用math.js

javaScript 浮点数运算的精度问题

 

问题:编程中你可能会遇到0.1*7=0.7000000000000001;

 

原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制浮点数的编程语言都会有这个问题,只不过在很多其他语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。

 

解决: 

1.对于普通数据计算可以用 toFix(2)截取;

2. 常用方法: 把需要计算的数字升级(乘以10的N次幂)成计算机能够识别的整数,等计算完毕后再降级(除以10的N次幂),这是大部分变成语言处理经度差异的通用方法;

function accAdd(arg1,arg2){

   var  r1,r2,m;
   try {r1=arg1.toString().split( "." )[1].length} catch (e){r1=0}
   try {r2=arg2.toString().split( "." )[1].length} catch (e){r2=0}
   m=Math.pow(10,Math.max(r1,r2))
   return  (arg1*m+arg2*m)/m
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add =  function  (arg){
   return  accAdd(arg, this );
}
 

3.对于金额这种要求严格的经度计算推荐使用math.js:

http://mathjs.org/examples/bignumbers.js.html

math.config({
  number: 'BigNumber', // Default type of number: // 'number' (default), 'BigNumber', or 'Fraction' precision: 20 // Number of significant digits for BigNumbers });


参考文献:http://mathjs.org/examples/bignumbers.js.html

转载于:https://www.cnblogs.com/juneling/p/8548577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值