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 相关文章推荐
JMenuTab简单使用说明
Mar 13 Javascript
javascript 全角转换实现代码
Jul 17 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
jQuery animate easing使用方法图文详解
Jun 17 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
React styled-components设置组件属性的方法
Aug 07 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
更改BootStrap popover的默认样式及popover简单用法
Sep 13 Javascript
vue多次循环操作示例
Feb 08 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
Aug 27 Javascript
React forwardRef的使用方法及注意点
Jun 13 Javascript
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操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
js实现页面导航层级指示效果
2020/08/25 Javascript
React实现轮播效果
2020/08/25 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python yield 使用浅析
2015/05/28 Python
python中logging包的使用总结
2018/02/28 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
Python中反射和描述器总结
2018/09/23 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
三个Unix的命令面试题
2015/04/12 面试题
大学毕业生工作的自我评价
2013/10/01 职场文书
毕业生求职简历中的自我评价
2013/10/18 职场文书
会计专业毕业生自我鉴定
2013/10/29 职场文书
保荐人的岗位职责
2013/11/19 职场文书
英语简历自我评价
2014/01/26 职场文书
公司接待方案
2014/03/08 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
九一八事变演讲稿
2014/09/05 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
python3 hdf5文件 遍历代码
2021/05/19 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python