`
萧十一狼
  • 浏览: 9113 次
  • 性别: 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。

    JS浮点数运算结果不精确的Bug解决

    JavaScript中的浮点数运算在某些情况下可能会导致不精确的结果,这是由于其内部处理机制和IEEE-754标准的特性所致。...可以结合上述方法,根据具体需求选择合适的解决方案,以避免因浮点数运算不精确而引发的错误。

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

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

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

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

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

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

    Javascript浮点数乘积运算出现多位小数的解决方法

    在使用Javascript进行数值运算时,常常会遇到浮点数乘积运算结果有多位小数的问题。这个问题主要是因为Javascript在内部处理浮点数时,并不是以十进制形式存储,而是转换成二进制形式进行运算。由于二进制对于某些十...

    详解JS– 浮点数运算处理

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

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

    在JavaScript编程中,处理浮点数的乘法运算有时候会遇到精度问题。这是因为计算机在内部使用二进制格式表示浮点数,而某些十进制小数无法被精确表示为二进制小数。当进行浮点数的算术运算时,这种表示上的差异会导致...

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

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

    main_half_javascript_半精度浮点数_Uint8Array_

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

    JavaScript 浮点 运算 函数

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

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

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

    js浮点数处理转精确值

    对于需要高精度计算的场景,JavaScript社区也提供了许多库,如`decimal.js`或`bignumber.js`,这些库专门设计用于处理高精度的数学运算,可以避免浮点数误差。它们提供了一种对象模型来表示和操作大数,从而确保计算...

    javascript 日期数字文本格式化

    `BigDecimal.js`通常用于处理大数运算,避免了JavaScript中浮点数运算精度问题,同时也提供了格式化输出的功能。而`MathContext.js`可能与`BigDecimal.js`一起使用,提供了数学上下文,用于设置运算精度和舍入模式。...

    javascript加减乘除的简洁实例_.docx

    在JavaScript中,进行基本的数学运算如加、减、乘、除是相当直观的,但当我们处理浮点数时,可能会遇到精度问题。这个文档提供了一些简洁的实例,通过自定义函数来解决浮点数计算时可能出现的精度丢失问题。 首先,...

    javascript float运算

    javascript float运算会有误差,可以用此脚本中的函数进行修补。

Global site tag (gtag.js) - Google Analytics