最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是JS来做。
做完以后,经手工核算,发现一个奇怪的问题。就是JS算出来的结果跟用计算器算出来的结果有差距。
想了很久,也没有想出问题出在哪里。
问题这样的:
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);
}
在你要用的地方包含这些函数,然后调用它来计算就可以了。
比如你要计算:7*0.8 ,则改成 (7).mul(8)
其它运算类似,就可以得到比较精确的结果。
分享到:
相关推荐
3. **使用库或内置方法**:有些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度的浮点数运算,提供更精确的计算结果。 4. **使用toFixed()**:虽然`toFixed()`方法可以将数字格式化为指定位数的小数,...
这些方法可以帮助我们解决 JavaScript 中的浮点数运算_bug_,从而确保浮点数运算的准确性。但是,需要注意的是,这些方法并不是万能的,在某些情况下,还需要根据实际情况进行调整。 浮点数运算_bug_是一个普遍存在...
在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的...在实际开发中,需要根据具体需求选择合适的方法来处理浮点数计算,以避免因精度问题引发的bug。
JavaScript中的浮点数运算在某些情况下可能会导致不精确的结果,这是由于其内部处理机制和IEEE-754标准的特性所致。...可以结合上述方法,根据具体需求选择合适的解决方案,以避免因浮点数运算不精确而引发的错误。
这种方法的好处是,你可以通过这个库统一处理所有的浮点数运算,避免了直接使用JavaScript内置运算符可能带来的精度问题。 总结来说,JavaScript中的浮点数运算误差是由于二进制浮点数表示的局限性造成的。通过保留...
为了避免这种非bug型的精度问题,一种常见的做法是将运算结果四舍五入到一定的小数位数。在JavaScript中,可以通过`toFixed()`方法实现这一操作,该方法接受一个参数指定保留的小数位数,并返回一个字符串表示的数。...
本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 首先,我们要理解JavaScript中的浮点数运算误差。在计算机内部,浮点数是以二进制形式存储的,但不是所有十进制...
4. **避免不必要的浮点数运算**:在某些情况下,可以尝试将数据转换为整数或比例来减少浮点数运算,从而降低不精确性的风险。 5. **使用BigDecimal类**:在某些高级应用中,可以考虑使用类似Java的`BigDecimal`类,...
由于javascript的浮点运算是不精确的(对于大多数编程语言都是这样),此程序使用整数来代替浮点数进行运算,最后再转化为浮点数,可以实现对设置范围内(运算范围在程序中为自定义变量range)的浮点运算实现精度...
### JavaScript避免数字计算精度误差的方法详解 #### 一、引言 在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。例如,一个简单的加法运算 `0.1 + 0.2` 的结果并不是预期中的 `0.3`,而是 `0....
在使用Javascript进行数值运算时,常常会遇到浮点数乘积运算结果有多位小数的问题。这个问题主要是因为Javascript在内部处理浮点数时,并不是以十进制形式存储,而是转换成二进制形式进行运算。由于二进制对于某些十...
在JavaScript中,浮点数运算时常会出现看似不准确的结果,这是因为JavaScript使用了IEEE 754标准来存储和处理浮点数,这个标准在处理某些特定的浮点数时会出现精度损失。例如,在上述问题中,`0.1 + 0.2` 不等于 `...
### JavaScript将浮点数转换成整数的三种方法 在JavaScript编程中,有时我们需要将浮点数转换为整数,这种需求在很多场景下都非常常见,例如数学计算、数据处理等。本文将详细介绍三种常见的方法来实现这一目标,并...
这可能涉及使用位操作而不是浮点数的算术运算,以及利用JavaScript引擎的特性,比如避免不必要的类型转换。 5. **应用场景**:半精度浮点数常用于图形渲染、物理模拟、数据压缩等,因为它们可以在保持足够的精度...
此函数是我自己写的,虽然在网上可以搜到很多,不过我找到的都是在算法中存在基本的浮点数的运算,导致结果仍然是错误的。由于刚刚学写JS,所以可能考虑不够周全,望大家批评指正。 代码中加了四舍五入函数,是网上...
这个方法的优点在于它避免了直接的浮点数运算,从而减少了精度损失。然而,需要注意的是,这种方法对于非常大的浮点数或非常小的浮点数可能不是最佳选择,因为它涉及到字符串处理,这可能会带来性能上的影响。此外,...
在JavaScript中,数字类型没有明显的整数和浮点数之分,所有数字都被视为浮点数,即使是像1、2、3这样的整数也被存储为浮点数形式。尽管如此,我们还是可以通过一些方法来判断一个数字是否可以当作整数来使用。 ...
这样可以避免浮点数的精度问题,因为整数运算不需要四舍五入。 需要注意的是,JavaScript整数的有效范围限制在-2^53到2^53之间,超出这个范围的运算可能会导致非预期的结果。这个范围是由JavaScript使用的64位双...
其实对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个...