解决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 相关文章推荐
js单向链表的具体实现实例
Jun 21 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
Mar 19 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
js Dom实现换肤效果
Oct 21 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
VUE 全局变量的几种实现方式
Aug 22 Javascript
JavaScript实现Excel表格效果
Feb 07 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
ES6新增的数组知识实例小结
May 23 Javascript
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 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
php中用文本文件做数据库的实现方法
2008/03/27 PHP
解析argc argv在php中的应用
2013/06/24 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
JavaScript中的私有成员
2006/09/18 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python导入oracle数据的方法
2015/07/10 Python
Python下载指定页面上图片的方法
2016/05/12 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
pow在python中的含义及用法
2019/07/11 Python
Python银行系统实战源码
2019/10/25 Python
python实现批量转换图片为黑白
2020/06/16 Python
python导入库的具体方法
2020/06/18 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
应届大学生的推荐信
2013/11/20 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
离婚财产处理协议书
2014/09/30 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
女儿满月酒致辞
2015/07/29 职场文书
2019年思想汇报
2019/06/20 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
Python turtle编写简单的球类小游戏
2022/03/31 Python