浅析js中的浮点型运算问题


Posted in Javascript onJanuary 06, 2014

js中浮点型是如何运算的呢?

例如:var a=0.69;

我想得到6.9 直接这样写 var c=a*10;

alert(c);   得到结果是:6.8999999999999995

到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法:

方法一:有js自定义函数

<script>
//加法函数,用来得到精确的加法结果 
//说明: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 accSub(arg1,arg2){
    var r1,r2,m,n;
    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));
    //last modify by deeka
    //动态控制精度长度
    n=(r1>=r2)?r1:r2;
    return ((arg1*m-arg2*m)/m).toFixed(n);
}
//除法函数,用来得到精确的除法结果 
//说明: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); 
} 
var a=0.69;
var b=10;
alert(a*b);//6.8999999999999995
alert((a*100)/10);
</script>

直接调用函数就可以。

方法二:如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

alert(11*22.9);//得到251.89999999999998
alert(11*(22.9*10)/10);//得到251.9

Javascript 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
JavaScript入门之基本函数详解
Oct 21 Javascript
javascript引用赋值(地址传值)用法实例
Jan 13 Javascript
React实现双向绑定示例代码
Sep 19 Javascript
jQuery实现模拟flash头像裁切上传功能示例
Dec 11 Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 Javascript
jQuery实现网页拼图游戏
Apr 22 jQuery
微信小程序Flex布局用法深入浅出分析
Apr 25 Javascript
微信小程序 checkbox使用实例解析
Sep 09 Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 Javascript
Node实现搜索框进行模糊查询
Jun 28 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 #Javascript
Jquery操作radio的简单实例
Jan 06 #Javascript
jQuery选择器全面总结
Jan 06 #Javascript
JavaScript定义类的几种方式总结
Jan 06 #Javascript
javascript函数定义的几种区别小结
Jan 06 #Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
You might like
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
phpfpm的作用和用法
2019/10/10 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
详解如何较好的使用js
2016/12/16 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
17个Python小技巧分享
2015/01/23 Python
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
Python实现快速计算词频功能示例
2018/06/25 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
python 写一个文件分发小程序
2020/12/05 Python
酒店销售经理岗位职责
2014/01/31 职场文书
春季防火方案
2014/05/10 职场文书
信息员培训方案
2014/06/12 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
贫困证明书范文
2015/06/16 职场文书
小学中队委竞选稿
2015/11/20 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
vue判断按钮是否可以点击
2022/04/09 Vue.js