解决JS中乘法的浮点错误的方法


Posted in Javascript onJanuary 03, 2014

JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: 

<script>
alert(11*22.9)
</script>

结果是251.89999999999998 而不是251.9 

这个问题想必有很多人为之头痛。那么如何解决呢?在此给出解决办法。

1、

<script> 
alert(11*(22.9*10)/10); 
</script> 
 
解决问题的大概思路就是,先把因数放大为整数,最后再除以相应的倍数,这样就能得到正确的结果了。 
2、
<script defer> 
Number.prototype.rate=function(){  
var oStr=this.toString(); 
if(oStr.indexOf(".")==-1)  
return 1; 
else 
return Math.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1)); 
} 
function tran(){ 
args=tran.arguments; 
var temp=1; 
for(i=0;i<args.length;i++) 
temp*=args[ i ]*args[ i ].rate(); 
for(i=0;i<args.length;i++)  
temp/=args[ i ].rate(); 
return temp 
} 
alert(tran(11,22.9)); 
</script>

该解决办法是比较麻烦的办法,但是却能让你大概了解解决这个问题的实际过程。

也可以用四舍五入的方法,  js中可以使用Math.round实现整数的四舍五入,如果需要实现精确到小数点多少位则需要编写函数了。

function ForDight(Dight,How) {
   Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How); 
   return Dight; 
}   
//除法函数,用来得到精确的除法结果
//说明: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);
}
Javascript 相关文章推荐
javascript Array.prototype.slice使用说明
Oct 11 Javascript
js使用正则实现ReplaceAll全部替换的方法
Aug 22 Javascript
js控制div弹出层实现方法
May 11 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 Javascript
JS仿淘宝实现的简单滑动门效果代码
Oct 14 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
一个小时快速搭建微信小程序的方法步骤
Apr 15 Javascript
vue el-tree 默认展开第一个节点的实现代码
May 15 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 #Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 #Javascript
JS+JSP checkBox 全选具体实现
Jan 02 #Javascript
使用js完成节点的增删改复制等的操作
Jan 02 #Javascript
js实现动态改变字体大小代码
Jan 02 #Javascript
js创建元素(节点)示例
Jan 02 #Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 #Javascript
You might like
destoon数据库表说明汇总
2014/07/15 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
JS+CSS实现过渡特效
2021/01/02 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
一些PHP的面试题
2015/05/06 面试题
广场舞大赛策划方案
2014/05/31 职场文书
银行奉献演讲稿
2014/09/16 职场文书
认真学习保证书
2015/02/26 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers