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动画效果代码
Jul 20 Javascript
精通Javascript系列之Javascript基础篇
Jun 07 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
js获取浏览器基本信息大全
Nov 27 Javascript
jQuery实现平滑滚动到指定锚点的方法
Mar 20 Javascript
jquery验证邮箱格式并显示提交按钮
Nov 07 Javascript
jQuery实现带玻璃流光质感的手风琴特效
Nov 20 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
ES2020让代码更优美的运算符 (?.) (??)
Jan 04 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 根据自增id创建唯一编号类
2017/04/06 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python3 实现调用串口功能
2019/12/26 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
模具专业推荐信
2013/10/30 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
应届生自荐书
2014/06/23 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
保险公司增员口号
2015/12/25 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL