解决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 相关文章推荐
jquery索引在使用中的一些困惑
Oct 24 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
May 05 Javascript
调整小数的格式保留小数点后两位
May 14 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
Dec 09 Javascript
vue实现评价星星功能
Jun 30 Javascript
javascript实现移动端轮播图
Dec 09 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二分查找二种实现示例
2014/03/12 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
web.py获取上传文件名的正确方法
2014/08/26 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
pytorch permute维度转换方法
2018/12/14 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
初中三年毕业生的自我评价分享
2014/02/14 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
车间主任岗位职责
2015/02/03 职场文书