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 小型打飞机游戏实现原理说明
Oct 28 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
Jan 07 Javascript
JavaScript中如何通过arguments对象实现对象的重载
May 12 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
Jul 07 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
解决vue中对象属性改变视图不更新的问题
Feb 23 Javascript
Angular脚手架开发的实现步骤
Apr 09 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
如何实现一个简易版的vuex持久化工具
Sep 11 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
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实现文件安全下载
2006/10/09 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
设定php简写功能的方法
2019/11/28 PHP
XML的代替者----JSON
2007/07/21 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Python生成不重复随机值的方法
2015/05/11 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python数据结构之链表的实例讲解
2017/07/25 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
pandas的排序和排名的具体使用
2019/07/31 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python 模拟登录B站的示例代码
2020/12/15 Python
python 实现IP子网计算
2021/02/18 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
生产部主管岗位职责
2014/01/06 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
企业标语大全
2014/07/01 职场文书
党员个人总结范文
2015/02/14 职场文书
学校捐书活动总结
2015/05/08 职场文书
陪护人员误工证明
2015/06/24 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
python获取带有返回值的多线程
2022/05/02 Python