解决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 命名规则 变量命名规则
Feb 25 Javascript
javascript下高性能字符串连接StringBuffer类
Aug 16 Javascript
IE的fireEvent方法概述及应用
Feb 22 Javascript
js 判断计算字符串长度/判断空的简单方法
Aug 05 Javascript
JS连连看源码完美注释版(推荐)
Dec 09 Javascript
node.js中 stream使用教程
Aug 28 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
使用vux实现上拉刷新功能遇到的坑
Feb 08 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 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中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
layui 设置table 行的高度方法
2018/08/17 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
python实现simhash算法实例
2014/04/25 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
小学见习报告
2014/10/31 职场文书
永远是春天观后感
2015/06/12 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
详解Python中下划线的5种含义
2021/07/15 Python
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis