js 计算精度问题,及解决办法
2018-01-29 15:52
931 查看
js计算精度问题(浮点数误差,大数计算出错)
JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如:0.1+0.2 //0.30000000000000004 1-0.9 //0.09999999999999998 9007199254740993-9007199254740992 //0 Math.pow(2,1023) //8.98846567431158e+307 //但是 Math.pow(2,1024) //Infinity
对于产生这些计算误差的具体原因这里不做探讨,如果想要了解可以到 https://github.com/camsong/blog/issues/9 了解其原理。
解决办法
1.代码如下// 解决四维运算,js计算失去精度的问题 //加法 Number.prototype.add = function(arg){ var r1,r2,m; try{r1=this.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) return (this*m+arg*m)/m } //减法 Number.prototype.sub = function (arg){ return this.add(-arg); } //乘法 Number.prototype.mul = function (arg) { var m=0,s1=this.toString(),s2=arg.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".")[1].length}catch(e){} return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) } //除法 Number.prototype.div = function (arg){ var t1=0,t2=0,r1,r2; try{t1=this.toString().split(".")[1].length}catch(e){} try{t2=arg.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(this.toString().replace(".","")) r2=Number(arg.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } }
0.1+0.2 // 0.30000000000000004 0.1.add(0.2) //0.3 0.3-0.1 //0.19999999999999998 0.3.sub(0.1) //0.2
2.可以通过引入 math.js 或者 bigNumber.js 进行解决
例如
99999999999999999999-99999999999999999000 // 0 new BigNumber('99999999999999999999').minus('99999999999999999000') //999 99999999999999999999===99999999999999999000 //true new BigNumber('99999999999999999999').eq('99999999999999999000') //false
BigNumber.js 支持很多相关计算,如果想了解更多请查阅相关API
相关文章推荐
- 关于js中计算精度的问题解决办法
- js计算精度解决办法
- JS浮点类型运算精度丢失问题解决办法
- JS 浮点运算精度解决办法 (把小数转换为整数进行计算【但是不能超过js的整数上限】)
- JS浮点计算时精度解决办法
- JS的浮点数计算精度丢失问题解决方案
- javascript(js)浮点数字精度问题的一个解决办法。
- js金额计算解决精度问题
- 关于js浮点精度计算不准确的问题及解决方法
- JS浮点计算精度问题分析与解决
- JS浮点类型运算精度丢失问题解决办法
- 用JS做计算的时候小数位不正常--Js中parseFloat()方法所产生的精度问题
- js计算精度问题,函数整理
- 关于js的ajax方法导致跨域问题的解决办法
- js浏览器兼容问题总结及解决办法
- jsEclipse 1.5.5不能启动问题解决办法
- js浮点数精度问题(js计算中遇到的坑)
- 没有文件扩展”js”的脚本引擎的问题的解决办法
- js浏览器兼容问题总结及解决办法
- Sql中使用Float来代替Datetime来存储造成的精度问题解决办法