37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 
我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 
怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。 
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 
比如:7*0.8 JavaScript算出来就是:5.6000000000000005

网上找到了一些解决办法,就是重新写了一些浮点运算的函数或直接扩大倍数运算。 
下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

------------------------------------------------------------------------------------------------------

(方法一:重写
浮点运算的函数)

//除法函数,用来得到精确的除法结果

//说明: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的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSubtr(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSubtr(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));
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//给Number类型增加一个subtr 方法,调用起来更加方便。
Number.prototype.subtr = function (arg){
return accSubtr(arg,this);
} 

在你要用的地方包含这些函数,然后调用它来计算就可以了。 
比如你要计算:7*0.8 ,则改成 (7).mul(8) 
其它运算类似,就可以得到比较精确的结果。

------------------------------------------------------------------------------------------------------

(方法二:重写浮点运算的函数)

//如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了
<script>
alert(11*(22.9*10)/10);
</script>

转载于:https://www.cnblogs.com/idoudou/archive/2012/11/05/2943828.html

JS浮点数运算Bug的解决办法(转自百度文库)相关推荐

  1. JS浮点数运算Bug的解决办法

    方法一:重写浮点运算的函数 //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:acc ...

  2. ie6 7 8下的一些bug和解决办法

    1:li边距"无故"增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑 ...

  3. Dumpzilla工具第615行bug的解决办法

    Dumpzilla工具第615行bug的解决办法 在Dumpzilla使用选项frequency时,会提示SQL语法错误.这是由于其中SQL语句编写错误.需要将615行中: where url lik ...

  4. css文本省略(······)行高错位(bug)- 解决办法

    应用css文本省略(······)属性:-webkit-line-clamp: 3; 导致:行高错位.(F12查看发现css属性line-height的值并没变,但为什么浏览器显示文本的实际行距却变小 ...

  5. eclipse中js中文乱码问题的解决办法

    eclipse中js中文乱码问题的解决办法 参考文章: (1)eclipse中js中文乱码问题的解决办法 (2)https://www.cnblogs.com/yanggb/p/11719126.ht ...

  6. js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法

    浏览器处理数字运算时精度丢失的方法 为什么0.1 + 0.2 不等于0.3.因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数 并不是所有的浮点数在计算机内部都存在舍入 ...

  7. ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

    背景 之前在一个项目中,涉及到了金额,协议组定的标准是按照分的单位进行传递的,但是交互上,web页面中为了更友好的体验,是使用的元作为单位的,这个时候就需要转换一下单位 本来是很简单的一个转化的需求, ...

  8. 浏览器常见bug及解决办法

    常见的bug列表: IE6下,当块级元素   margin与float同方向时,margin会加倍  例如 .box{float:left;margin-left:10px;}在IE6下表现的marg ...

  9. IE6 遇到bug及解决办法

    一.IE6 双倍边距 bug 当页面上的元素使用 float 浮动时,不管是向左还是向右浮动;只要该元素带有 margin 像素都会使该值乘以 2,例如"margin-left:10px&q ...

最新文章

  1. CMake常见指令总结
  2. Linux下的文件系统修复
  3. 流量难、获客难、增长难?增长黑客思维“解救”B端业务
  4. 30道经典SQL面试题讲解(11-20)
  5. sequelize连接mysql_Sequelize没有连接mysql
  6. 深入浅出SharePoint——WSS升级和数据迁移
  7. 图论之二分图-HihoCoder1121
  8. python写一个app接收摄像头传输的视频_如何使用Python中的tcp套接字发送和接收网络摄像头流?...
  9. 软件行业渠道的价值在哪里?
  10. Winboard - X
  11. 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
  12. 解密阿里线上问题诊断工具Arthas和jvm-sandbox
  13. 吾爱破解专用虚拟机系统不能安装VMwaretools问题!
  14. 我的超休闲游戏作品集
  15. Afc2add与AppSync
  16. 医院病历管理系统java版本二
  17. 啊5G 你比4G多1G
  18. Android向通讯录添加联系人的一般方法
  19. UVA 11178-Morley's Theorem(计算几何_莫雷定理)
  20. 基于双门限法的语音端点检测及语音分割

热门文章

  1. 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”
  2. Python相关系数矩阵热力图(二)
  3. 计算机系本科毕业论文评阅评语,毕业论文评阅教师评语
  4. Flutter之Decoration(边框、圆角、阴影、形状、渐变、背景图像等)
  5. vue页面翻页勾选的记忆功能
  6. perl unload gbk oracle 数据库
  7. java实现两个整数相除保留一位小数
  8. OC:数组排序、时间格式化字符串
  9. 如何使用来电盒--宇然电脑公司管理软件
  10. 汇编语言-求毕达哥拉斯三角形的边