解决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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
SeaJS入门教程系列之完整示例(三)
Mar 03 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
Aug 12 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
微信小程序实现YDUI的ScrollNav组件
Feb 02 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
vue 父组件中调用子组件函数的方法
Jun 06 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
浅析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
一个程序下载的管理程序(二)
2006/10/09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
js实现批量删除功能
2020/08/27 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
python字典get()方法用法分析
2015/04/17 Python
Python输出各行命令详解
2018/02/01 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
如何在django中添加日志功能
2020/02/06 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
医学专业职业生涯规划范文
2014/02/05 职场文书
电子专业自荐信
2014/07/01 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
验房委托书
2014/08/30 职场文书
师德师风个人总结
2015/02/06 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL