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 相关文章推荐
jquery-easyui关闭tab自动切换到前一个tab
Jul 29 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
Javascript this 关键字 详解
Oct 22 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
Nov 26 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 Javascript
canvas实现刮刮卡效果
Mar 14 Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 Javascript
使用JS动态显示文本
Sep 09 Javascript
JavaScript内存泄漏的处理方式
Nov 20 Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 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制作的中文拼音首字母工具类
2014/12/11 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
python实现数字炸弹游戏
2020/07/17 Python
中文专业求职信
2014/06/20 职场文书
大专生求职信
2014/06/29 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
校运会宣传稿大全
2015/07/23 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python
Java后台生成图片的完整步骤
2021/08/04 Java/Android