`
萧十一狼
  • 浏览: 9173 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

javascript 的 浮点数运算 bug 避免方法(转载,出处不明)

阅读更多
最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是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)
  其它运算类似,就可以得到比较精确的结果。
分享到:
评论

相关推荐

    JavaScript 浮点数运算 精度问题

    3. **使用库或内置方法**:有些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度的浮点数运算,提供更精确的计算结果。 4. **使用toFixed()**:虽然`toFixed()`方法可以将数字格式化为指定位数的小数,...

    解决JS浮点数运算出现Bug的方法

    这些方法可以帮助我们解决 JavaScript 中的浮点数运算_bug_,从而确保浮点数运算的准确性。但是,需要注意的是,这些方法并不是万能的,在某些情况下,还需要根据实际情况进行调整。 浮点数运算_bug_是一个普遍存在...

    解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的...在实际开发中,需要根据具体需求选择合适的方法来处理浮点数计算,以避免因精度问题引发的bug。

    javaScript实现浮点数转十六进制字符

    由于JavaScript直接使用浮点数转十六进制的功能实现并不直接,因此需要借助其他方法来实现。下面将详细介绍这些知识点以及相关的JavaScript代码实现。 1. 浮点数在计算机中的表示: 浮点数是一种小数和整数混合的数...

    JS浮点数字操作插件floatOPS.js

    在JavaScript编程中,...总结起来,floatOPS.js是一个专注于解决JavaScript中浮点数运算精度问题的插件,通过提供加减乘除四个方法,确保了在进行浮点数运算时的精度,对于需要精确计算的场景具有很高的实用价值。

    详解JS-- 浮点数运算处理

    这种方法的好处是,你可以通过这个库统一处理所有的浮点数运算,避免了直接使用JavaScript内置运算符可能带来的精度问题。 总结来说,JavaScript中的浮点数运算误差是由于二进制浮点数表示的局限性造成的。通过保留...

    JavaScript浮点数及运算精度调整详解

    为了避免这种非bug型的精度问题,一种常见的做法是将运算结果四舍五入到一定的小数位数。在JavaScript中,可以通过`toFixed()`方法实现这一操作,该方法接受一个参数指定保留的小数位数,并返回一个字符串表示的数。...

    js中浮点型运算BUG的解决方法说明.docx

    本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 首先,我们要理解JavaScript中的浮点数运算误差。在计算机内部,浮点数是以二进制形式存储的,但不是所有十进制...

    使用Vue.js及Element编写的精度浮点运算计算器源码(打开运行)

    由于javascript的浮点运算是不精确的(对于大多数编程语言都是这样),此程序使用整数来代替浮点数进行运算,最后再转化为浮点数,可以实现对设置范围内(运算范围在程序中为自定义变量range)的浮点运算实现精度...

    javascript避免数字计算精度误差的方法详解.docx

    ### JavaScript避免数字计算精度误差的方法详解 #### 一、引言 在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。例如,一个简单的加法运算 `0.1 + 0.2` 的结果并不是预期中的 `0.3`,而是 `0....

    详解JS– 浮点数运算处理

    在JavaScript中,浮点数运算时常会出现看似不准确的结果,这是因为JavaScript使用了IEEE 754标准来存储和处理浮点数,这个标准在处理某些特定的浮点数时会出现精度损失。例如,在上述问题中,`0.1 + 0.2` 不等于 `...

    javascript将浮点数转换成整数的三个方法.docx

    ### JavaScript将浮点数转换成整数的三种方法 在JavaScript编程中,有时我们需要将浮点数转换为整数,这种需求在很多场景下都非常常见,例如数学计算、数据处理等。本文将详细介绍三种常见的方法来实现这一目标,并...

    main_half_javascript_半精度浮点数_Uint8Array_

    这可能涉及使用位操作而不是浮点数的算术运算,以及利用JavaScript引擎的特性,比如避免不必要的类型转换。 5. **应用场景**:半精度浮点数常用于图形渲染、物理模拟、数据压缩等,因为它们可以在保持足够的精度...

    JavaScript 浮点 运算 函数

    此函数是我自己写的,虽然在网上可以搜到很多,不过我找到的都是在算法中存在基本的浮点数的运算,导致结果仍然是错误的。由于刚刚学写JS,所以可能考虑不够周全,望大家批评指正。 代码中加了四舍五入函数,是网上...

    Javascript中浮点数相乘的一个解决方法

    这个方法的优点在于它避免了直接的浮点数运算,从而减少了精度损失。然而,需要注意的是,这种方法对于非常大的浮点数或非常小的浮点数可能不是最佳选择,因为它涉及到字符串处理,这可能会带来性能上的影响。此外,...

    详解JavaScript的BUG和错误

    因此,在编写JavaScript程序时,程序员应该注意变量的类型,避免类型混淆。 总的来说,JavaScript的BUG和错误处理是编程中一项非常重要的工作。通过合理利用严格模式和在编码时注意变量类型和逻辑设计,可以大大...

    JavaScript检查数字是否为整数或浮点数的方法

    在JavaScript中,数字类型没有明显的整数和浮点数之分,所有数字都被视为浮点数,即使是像1、2、3这样的整数也被存储为浮点数形式。尽管如此,我们还是可以通过一些方法来判断一个数字是否可以当作整数来使用。 ...

    JavaScript小数点精确计算

    由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将深入探讨这个问题,并提供一些解决方案。 首先,我们来理解...

Global site tag (gtag.js) - Google Analytics