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中的数学函数集合
May 08 Javascript
js getElementsByTagName的简写方式
Jun 27 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
Nov 20 Javascript
基于JQuery实现异步刷新的代码(转载)
Mar 29 Javascript
JavaScript NaN和Infinity特殊值 [译]
Sep 20 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
Javascript中的默认参数详解
Oct 22 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
输入框点击时边框变色效果的实现方法
Dec 26 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
Node 升级到最新稳定版的方法分享
May 17 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脚本加密专家php解密算法
2020/09/13 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
js 两数组去除重复数值的实例
2017/12/06 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
Python中统计函数运行耗时的方法
2015/05/05 Python
django框架如何集成celery进行开发
2017/05/24 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
对Python中画图时候的线类型详解
2019/07/07 Python
python hashlib加密实现代码
2019/10/17 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
python新手学习使用库
2020/06/11 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
新学期校长寄语
2014/01/18 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js