一、事件
最近在做项目的管理费,在客户端用js写的。发现了一个重大问题,比如0.7*8.1=5.6699999999,10.3-9.2=1.100000000014.为什么会出现这些问题呢?难道是js对浮点数运算的bug?该怎么办?
二、响应
“内事不决问百度,外事不决问google”啊,上网查找资料,证实了我的想法,也找到了解决方案。同时我也有了自己的解决方案。
1、网上解决方案是对浮点数的运算做了类似重写,代码如下:(转载)
//除法函数,用来得到精确的除法结果
//说明: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);
}
//减法函数
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 ((arg2*m-arg1*m)/m).toFixed(n);
}
///给number类增加一个sub方法,调用起来更加方便
Number.prototype.sub = function (arg){
return accSub(arg,this);
}
这样,如果你要计算0.7*8.1 只需(0.7).mul(8.1)调用mul方法就可以得到准确的答案。
2、我的解决方案
这不失为一种好方法,然而,我想将浮点型转化为整形后再做运算也是解决的一种方法。如0.7*8.1,我们可以这么算(0.7*10)*(8.1*10)/100,结果为5.67,显然是可以的。又通过项目的实践,都能得出准确的结果。
三、总结:
1、尽量不要用JS做复杂的运算,特别是浮点数的运算。
2、如果一定要进行浮点数的运算的话,先将浮点数转化为整形,再运算。
摘自:
http://www.cnblogs.com/jiahaipeng/archive/2008/10/29/1321821.html
分享到:
相关推荐
本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 首先,我们要理解JavaScript中的浮点数运算误差。在计算机内部,浮点数是以二进制形式存储的,但不是所有十进制...
JavaScript 中 Number 数字数值运算后值不对的解决方法 ...解决 JavaScript 中 Number 数字数值运算后值不对的问题需要重新编写浮点运算函数或使用 Number 的 prototype 方法来实现精确的浮点运算。
曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化 代码如下://除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的...
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...
在JavaScript编程语言中,浮点数运算时常会遇到精度问题,这是因为JS的浮点数表示遵循IEEE 754标准,这种表示方式在处理特定数值时可能会产生微小的误差。例如,`37.5 * 5.5` 在JS中计算的结果并不是预期的 `206.08`...
到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法: 方法一:有js自定义函数 代码如下:[removed] //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会...
浮点数加减乘除运算,里面结合了从网上搜索到的accAdd版本以及新增版本的浮点加减乘除运算,明显能直出新补充方法能满足实际需求,解决js对于浮点运算的bug.
最近在做项目的时候,涉及到产品价格的计算,经常会出现JS浮点数精度问题,这个问题,对于财务管理系统的开发者来说,是个非常严重的问题(涉及到钱相关的问题都是严重的问题),这里把相关的原因和问题的解决方案...
因用发条js1.9,中文会出现乱码,用鬼鬼的就可以,发现本坛上只有7.0,其他地方找到了7.5的,给有需要的人下载。以下内容为转载: 鬼鬼JS调试工具,就如软件名说的那样,辅Zhu...解决某些浮点类型的运算结果不正确。
4. **使用库或数据类型**:有一些JavaScript库,如`decimal.js`或`big.js`,提供了专门处理高精度计算的数据类型和操作,它们可以确保在进行浮点运算时得到完全精确的结果。 5. **四舍五入或截断**:在显示结果时,...
但是2.3.3存在Bug,Js调用Java会导致程序崩溃, 所以没办法,最后是用 BeanShell来解析的。 不过,因为需要每个参与计算的数字都是浮点型, 才能正确无误的保留精度,因为我正则不行,过滤表达式还是花了点功夫 ...
其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754标准实现,在使用中会遇到某些 Bug。 Typeof typeof 对于基本类型,除了 null 都可以显示正确的类型。对于对象,除了函数都会显示 object。...
JavaScript作为一种动态类型语言,数据类型的转换是编程中一个不可忽视的话题。在实际的开发过程中,开发者经常...了解并掌握这些知识,能够帮助我们更有效地进行JavaScript编程,避免因类型转换不当造成的bug和错误。
- ESP32集成了双核32位LX6微处理器,支持浮点运算,提供更高的处理能力。 - 内置Wi-Fi(802.11 b/g/n)和蓝牙(包括经典蓝牙和BLE蓝牙低功耗)功能,方便无线通信。 - 集成多种传感器接口,如I2C、SPI、UART,...
`same-ish`是一个专门为解决这个问题而设计的Clojure库,它提供了一种在测试环境中进行浮点数近似比较的方法,从而提高了测试的可靠性和准确性。 Clojure是一种基于Lisp的函数式编程语言,它运行在Java平台上,拥有...
同时,内置的浮点加法器则为处理浮点数运算提供了便利。 【开源软件】: 开源软件(Open Source Software, OSS)是指其源代码对公众开放,允许用户查看、修改和分发的软件。这种软件模型鼓励社区协作和持续改进,...