js中Number数字数值运算后值不对的解决方法


Posted in Javascript onFebruary 28, 2017

问题:

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)

我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998

怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。

我Google了一下,发现原来这是JavaScript浮点运算的一个bug。

比如:7*0.8 JavaScript算出来就是:5.6000000000000005

解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。

下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码

//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
 var t1=0,t2=0,r1,r2;
 try{t1=arg1.toString().split(".")[1].length}catch(e){}
 try{t2=arg2.toString().split(".")[1].length}catch(e){}
 with(Math){
 r1=Number(arg1.toString().replace(".",""))
 r2=Number(arg2.toString().replace(".",""))
 return (r1/r2)*pow(10,t2-t1);
 }
}

//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
 return accDiv(this, arg);
}

//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)
{
 var m=0,s1=arg1.toString(),s2=arg2.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类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
 return accMul(arg, this);
}

//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
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);
}

减法函数

function accSub(arg1, arg2) {
var r1, r2, m, n;
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));
//last modify by deeka
//动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

在你要用的地方包含这些函数,然后调用它来计算就可以了。

比如你要计算:7*0.8 ,则改成 (7).mul(8)

其它运算类似,就可以得到比较精确的结果。

以上这篇js中Number数字数值运算后值不对的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
提高代码性能技巧谈—以创建千行表格为例
Jul 01 Javascript
jquery cookie插件代码类
May 26 Javascript
基于JQuery 的消息提示框效果代码
Jul 31 Javascript
Extjs优化(二)Form表单提交通用实现
Apr 15 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
Jul 07 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
vue 实现上传组件
May 31 Vue.js
canvas绘图不清晰的解决方案
Feb 28 #Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 #Javascript
js数字计算 误差问题的快速解决方法
Feb 28 #Javascript
js数字舍入误差以及解决方法(必看篇)
Feb 28 #Javascript
JS实现浏览器打印、打印预览示例
Feb 28 #Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 #Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 #Javascript
You might like
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
smarty表格换行实例
2014/12/15 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
Python中防止sql注入的方法详解
2017/02/25 Python
使用tensorflow实现线性svm
2018/09/07 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
python interpolate插值实例
2020/07/06 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
篝火晚会主持词
2014/03/25 职场文书
安全生产责任书范本
2014/04/15 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
2019 入党申请书范文
2019/07/10 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python