解决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小技巧
Jul 21 Javascript
jQuery 性能优化指南 (1)
May 21 Javascript
JS 自定义函数缺省值的设置方法
May 05 Javascript
jQuery中阻止冒泡事件的方法介绍
Apr 12 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
Bootstrap实现input控件失去焦点时验证
Aug 04 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
JavaScript中var的重要性实例分析
Jul 09 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
vue.js 使用原生js实现轮播图
Apr 26 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
js获取url传值的方法
2015/12/18 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
原生JS进行前后端同构
2018/04/22 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
青春寄语大全
2014/04/09 职场文书
职务说明书范文
2014/05/07 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技