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 相关文章推荐
accesskey 提交
Jun 26 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
JavaScript对象学习经验整理
Oct 12 Javascript
javascript动态添加删除tabs标签的方法
Jul 06 Javascript
Bootstrap布局方式详解
May 27 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
layer父页获取弹出层输入框里面的值方法
Sep 02 Javascript
原生JavaScript实现简单五子棋游戏
Jun 28 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
删除无限级目录与文件代码共享
2006/07/12 PHP
BBS(php & mysql)完整版(四)
2006/10/09 PHP
php魔术变量用法实例详解
2014/11/13 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
js实现图片轮换效果代码
2013/04/16 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
javascript 内存模型实例详解
2020/04/18 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Python的log日志功能及设置方法
2019/07/11 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
区三好学生主要事迹
2014/01/30 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
毕业证代领委托书
2014/09/26 职场文书
图书借阅制度范本
2015/08/06 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
PyTorch device与cuda.device用法
2022/04/03 Python
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技