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 相关文章推荐
Javascript引用指针使用介绍
Nov 07 Javascript
一个简单的瀑布流效果(主体形式自写)
May 27 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
Nov 02 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
js获取浏览器的各种属性
Apr 27 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
原生JS实现不断变化的标签
May 22 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
Sep 08 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python使用递归的方式建立二叉树
2019/07/03 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
python plotly绘制直方图实例详解
2019/07/22 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
中餐厅经理岗位职责
2014/04/11 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
新学期标语
2014/06/30 职场文书
三下乡活动心得体会
2016/01/23 职场文书
八年级作文之友情
2019/11/25 职场文书
mysql函数之截取字符串的实现
2022/08/14 MySQL