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 相关文章推荐
js event事件的传递与冒泡处理
Dec 06 Javascript
jquery each的几种常用的使用方法示例
Jan 21 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
关于javascript中dataset的问题小结
Nov 16 Javascript
跟我学习javascript的undefined与null
Nov 17 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
webpack4 + react 搭建多页面应用示例
Aug 03 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
Aug 22 Javascript
自定义Vue组件打包、发布到npm及使用教程
May 22 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中for循环语句的几种变型
2006/11/26 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[03:48]大碗DOTA
2019/07/25 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
Python中的默认参数详解
2015/06/24 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
python2.7实现邮件发送功能
2018/12/12 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python列表list操作相关知识小结
2020/01/29 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
路政管理专业推荐信
2013/11/11 职场文书
婚礼主持结束词
2014/03/13 职场文书
水电站项目建议书
2014/05/12 职场文书
标准单位租车协议书
2014/09/23 职场文书
员工离职通知函
2015/04/25 职场文书
企业安全生产检查制度
2015/08/06 职场文书
单位病假条范文
2015/08/17 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
openstack中的rpc远程调用的方法
2021/07/09 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL