`

js浮点运算精度丢失的解决办法

    博客分类:
  • JS
阅读更多
js中进行浮点数运算时容易出现精度问题,以下方法可以解决
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);
}

2)
//乘法函数,用来得到精确的乘法结果
//说明: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);
}

3)
//加法函数,用来得到精确的加法结果
//说明: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);
}

4)
//减法函数,用来得到精确的减法结果
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 ((arg1*m-arg2*m)/m).toFixed(n);
}
分享到:
评论
1 楼 zhangleijava1 2015-04-08  
还是会精度丢失的。

相关推荐

    Javascript 浮点运算精度问题分析与解决

    ### Javascript 浮点运算精度问题分析与解决 #### 知识点一:浮点数精度问题的普遍性 首先需要明确的是,浮点运算精度问题并不仅仅存在于JavaScript中,这实际上是计算机科学中的一个普遍问题。原因在于计算机使用...

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

    在实际项目中,这些函数可以有效地解决浮点运算中的精度问题。例如,如果你需要进行金融计算,或者任何对精度有严格要求的场景,都可以使用这些函数来替代JavaScript内置的运算符。 除了上述函数,还有一些其他策略...

    Javascript 浮点运算的问题分析与解决方法

    这样一来,我们就可以像这样比较浮点数:`(1.0 - 0.7).isEqual(0.3)`,这会返回`true`,从而解决了浮点运算精度问题导致的不正确比较。 总的来说,处理JavaScript中的浮点运算问题需要理解浮点数表示的内在限制,并...

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

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

    详解JavaScript中精度失准问题及解决方法

    2. 使用`BigInt`类型:自ES2020起,JavaScript引入了`BigInt`类型,专为处理大整数设计,它不受到53位精度限制,可以存储任意大小的整数,但不支持浮点运算。 3. 将数字转换为字符串:在进行大数运算时,可以将数字...

    javascript 浮点数运算

    Javascript 和大部分语言一样在浮点数运算时,经常出现精度丢失的问题,由于现在的大量Web项目经常涉及到货币计算或数学高级计算,此插件提供简单浮点运算,浮点存储格式符合IEEE754计算机

    decimaljsJavaScript的任意精度Decimal类型

    Decimal.js 是一个专门为JavaScript设计的高精度数字计算库,它主要解决了JavaScript中浮点数运算精度丢失的问题。在JavaScript中,由于其内置的Number类型使用的是双精度浮点数(IEEE 754),在进行大数值或者高...

    JS小数运算出现多为小数问题的解决方法

    问题的一个典型例子是0.1+0.2不等于0.3,这是因为JavaScript中的浮点运算在内部表示和运算时会出现误差。 为了解决这个问题,我们可以采用一些方法来提高JavaScript中浮点数运算的精度。一种方法是通过自定义函数来...

    JS 能表示的最大数值及JS Number类型数字位数及IEEE754标准1

    6. 解决方案:对于小数精度问题,可以使用乘以一个大数(比如10的适当次幂),进行整数运算,然后除回去来恢复原始值,这种方法可以减少因浮点运算造成的精度误差。 7. IEEE 754标准:该标准定义了浮点数的存储格式...

    计算器.rar

    1. **JS浮点运算精度问题**:在JavaScript中,由于其内部表示浮点数的方式,可能导致在进行浮点数运算时出现精度丢失的问题。例如,简单的数字相减可能会得到不精确的结果。为了解决这个问题,开发者可能采用了如`...

    前端面试题之baseJS-floatpoint.zip

    1. **浮点数精度问题**:由于浮点数的存储方式,JavaScript在进行浮点数运算时可能会出现精度丢失。例如,`0.1 + 0.2 !== 0.3`,这是因为浮点数在二进制下无法精确表示,导致计算结果的小数部分有误差。面试中,理解...

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

    在实际应用中,还可以考虑使用其他库,如`decimal.js`或`bignumber.js`,这些库专门用于处理高精度的浮点数运算,能提供更可靠的解决方案。同时,如果对性能有较高要求,可以考虑使用位运算或者二进制表示法来优化...

    c# 定点数库演示,c#和C++有什么差别.docx

    浮点数在计算机内部是以二进制形式存储的,这种表示方式可能导致精度丢失,产生舍入误差。为了解决这一问题,定点数被引入作为替代方案。定点数是一种利用整数来表示带有小数部分的数值,通过预设的小数位数和固定...

    BigNumber-源码.rar

    其中,`divide()`方法特别值得关注,它支持自定义精度和舍入模式,可以防止因除法运算导致的精度丢失。 4. **舍入策略** `BigDecimal`提供了多种舍入策略,如ROUND_UP(向上舍入)、ROUND_DOWN(向下舍入)等。在...

    floating-buffer:非标准浮点转换

    这种格式能够表示非常大或非常小的数值,但处理某些特定的浮点运算时可能会损失精度。floating-buffer模块则尝试提供一种不同的方式来处理浮点数,特别是针对8位浮点数的场景,这可能是为了节省内存或者优化计算效率...

    js截取小数点后几位的写法

    由于JavaScript中的数字精度限制,当数字非常大或者非常小的时候,直接进行运算可能会有精度丢失的问题。为了解决这一问题,可以使用`***recision()`方法。`toPrecision()`方法可以用来格式化数字为指定位数的精确...

    js浮点数精确计算(加、减、乘、除)

    另外,对于更复杂或者性能要求更高的场景,可能还需要考虑其他算法或库,例如BigNumber.js、decimal.js等,它们专为解决大数和高精度计算问题而设计。 文章中的代码示例和解释强调了JavaScript中浮点数运算的不精确...

Global site tag (gtag.js) - Google Analytics