JavaScript 浮点数运算 精度问题


Posted in Javascript onOctober 06, 2009

Js代码

<script type="text/javascript" language="javascript"> 
alert(1/3);//弹出: 0.3333333333333333 
alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 
alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999 
alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8 
alert(0.000001 / 0.0001);//弹出: 0.009999999999999998 
</script> 
<script type="text/javascript" language="javascript"> 
    alert(1/3);//弹出: 0.3333333333333333 
    alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 
    alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999 
    alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8 
    alert(0.000001 / 0.0001);//弹出: 0.009999999999999998 
</script> 
[code] 
按正常计算的话,除第一行外(因为其本身就不能除尽),其他都应该要得到精确的结果,从弹出的结果我们却发现不是我们想要的正确结果。为了解决浮点数运算不准确的问题,在运算前我们把参加运算的数先升级(10的X的次方)到整数,等运算完后再降级(0.1的X的次方)。现收集并整理贴于此,以备后用。 
加法 
Js代码 
[code] 
//说明: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的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用: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); 
} 
减法 
Js代码 
[code] 
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 
//调用:accSub(arg1,arg2) 
//返回值:arg1减上arg2的精确结果 
function accSub(arg1,arg2){ 
return accAdd(arg1,-arg2); 
} 
//给Number类型增加一个sub方法,调用起来更加方便。 
Number.prototype.sub = function (arg){ 
return accSub(this,arg); 
} 
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 
//调用:accSub(arg1,arg2) 
//返回值:arg1减上arg2的精确结果 
function accSub(arg1,arg2){ 
return accAdd(arg1,-arg2); 
} 
//给Number类型增加一个sub方法,调用起来更加方便。 
Number.prototype.sub = function (arg){ 
return accSub(this,arg); 
}

乘法
Js代码
//说明: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的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 
//调用: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); 
} 除法 
Js代码 
//说明: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的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 
//调用: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); 
}

测试一把
Js代码
<script type="text/javascript" language="javascript"> 
/* 
alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 
alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999 
alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8 
alert(0.000001 / 0.0001);//弹出: 0.009999999999999998 
*/ 
alert(0.09999999.add(0.00000001));//弹出: 0.1 
alert(-0.09999999.sub(0.00000001));//弹出: -0.09999998 
alert(0.012345.mul(0.000001));//弹出: 1.2345e-8 
alert(0.000001.div(0.0001));//弹出: 0.01 
</script>
Javascript 相关文章推荐
[JSF]使用DataModel处理表行事件的实例代码
Aug 05 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
jquery实现点击页面计算点击次数
Jan 23 Javascript
JS中捕获console.log()输出的方法
Apr 16 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
Oct 12 Javascript
详解JavaScript编程中的数组结构
Oct 24 Javascript
Angular2 自定义validators的实现方法
Jul 05 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
vue插件实现v-model功能
Sep 10 Javascript
layui复选框的全选与取消实现方法
Sep 02 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
VUE : vue-cli中去掉路由中的井号#操作
Sep 04 Javascript
面向对象的javascript(笔记)
Oct 06 #Javascript
js removeChild 障眼法 可能出现的错误
Oct 06 #Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 #Javascript
JQuery与Ajax常用代码实现对比
Oct 03 #Javascript
Jquery 设置标题的自动翻转
Oct 03 #Javascript
点击下载链接 弹出页面实现代码
Oct 01 #Javascript
点击文章内容处弹出页面代码
Oct 01 #Javascript
You might like
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
详解参数传递四种形式
2015/07/21 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python获取代理IP的实例分享
2018/05/07 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
2014年社区学雷锋活动总结
2014/03/09 职场文书
保护环境的建议书
2014/03/12 职场文书
《春晓》教学反思
2014/04/20 职场文书
法院授权委托书格式
2014/09/28 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
茶花女读书笔记
2015/06/29 职场文书
致接力运动员加油稿
2015/07/21 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android