解决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 兼容所有浏览器的DOM扩展功能
Aug 01 Javascript
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
May 04 Javascript
js生成缩略图后上传并利用canvas重绘
May 15 Javascript
javascript生成随机数的方法
May 16 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
Jul 01 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
微信小程序动态显示项目倒计时
Jun 20 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
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
Python编程中运用闭包时所需要注意的一些地方
2015/05/02 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
浅析python参数的知识点
2018/12/10 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
Python Django搭建网站流程图解
2020/06/13 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
python中upper是做什么用的
2020/07/20 Python
python3跳出一个循环的实例操作
2020/08/18 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
毕业生的自我评价范文
2013/12/31 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
cf战队宣传语
2015/07/13 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python