`
陈英杰_-_
  • 浏览: 17251 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

js浮点运算精度丢失问题

 
阅读更多

转自:http://segmentfault.com/a/1190000002613722

原因:

        Javascript采用了IEEE-745浮点数表示法(几乎所有的编程语言都采用),这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024。遗憾的是,我们常用的分数(特别是在金融的计算方面)都是十进制分数1/10,1/100等。二进制浮点数表示法并不能精确的表示类似0.1这样 的简单的数字,上诉代码的中的x和y的值非常接近最终的正确值,这种计算结果可以胜任大多数的计算任务:这个问题也只有在比较两个值是否相等时才会出现。

 

<!DOCTYPE html>
<html>
<head>
    <title>Number Example 1</title>
    <script type="text/javascript">
        alert(0.1 + 0.2); //浮点运算
    </script>
</head>
<body>

</body>
</html>

0.1 => 0.0001 1001 1001 1001…(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

 

解决方法:

  //加法   
    Number.prototype.add = function(arg){   
        var r1,r2,m;   
        try{r1=this.toString().split(".")[1].length}catch(e){r1=0}   
        try{r2=arg.toString().split(".")[1].length}catch(e){r2=0}   
        m=Math.pow(10,Math.max(r1,r2))   
        return (this*m+arg*m)/m   
    }  
    //减法   
Number.prototype.sub = function (arg){   
    return this.add(-arg);   
}   

//乘法   
Number.prototype.mul = function (arg)   
{   
    var m=0,s1=this.toString(),s2=arg.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.prototype.div = function (arg){   
    var t1=0,t2=0,r1,r2;   
    try{t1=this.toString().split(".")[1].length}catch(e){}   
    try{t2=arg.toString().split(".")[1].length}catch(e){}   
    with(Math){   
        r1=Number(this.toString().replace(".",""))   
        r2=Number(arg.toString().replace(".",""))   
        return (r1/r2)*pow(10,t2-t1);   
    }   
}

 

分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

    javascript 浮点数运算

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

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

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

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

    当超过这个值时,大整数的运算可能会导致精度丢失。例如,9007199254740992加上1、2分别会导致不同的结果,其中9007199254740992 + 1和9007199254740992 + 3会丢失精度,而9007199254740992 + 2和9007199254740992 +...

    decimaljsJavaScript的任意精度Decimal类型

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

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

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

    计算器.rar

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

    前端面试题之baseJS-floatpoint.zip

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

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

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

    floating-buffer:非标准浮点转换

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

    BigNumber-源码.rar

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

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

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

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

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

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

    在JavaScript中,浮点数运算可能会遇到精度问题,这是由于其内部存储机制导致的。浮点数在计算机中是按照二进制浮点格式存储的,这种格式在表示某些十进制小数时会有不可预测的误差。因此,当你进行浮点数相乘时,...

Global site tag (gtag.js) - Google Analytics