浮點數精度丟失問題


一. 浮點數精度丟失的緣由javascript

1. 計算機的二進制實現和位數限制有些數沒法表示。就像一些無理數不能有限表示,如:圓周率3.1415926...,1.333...等。JS遵循 IEEE 754 規範,採用雙精度存儲(double precision),佔用64bit。如圖:html

s
eeeeeee  eeee
ffff  ffffffff  ffffffff  ffffffff  ffffffff  ffffffff
1
11
52

說明:java

  • 1位用來表示符號位oracle

  • 11位用來表示指數ide

  • 52位表示尾數函數

JS中能精準表示的最大整數是Math.pow(2, 53),十進制 9007199254740992,大於 9007199254740992 就可能丟失精度。學習

詳細瞭解能夠看這篇論文:What Every Computer Scientist Should Know About Floating-Point Arithmetic
spa


二. 浮點數的加減乘除.net

1. 兩個浮點數相乘htm

alert("1024.2 * 1.2 = " + (1024.2 * 0.2));

三. 解決方案

1. 先把浮點數放大倍數到整數,再進行運算,最後將結果縮小倍數。

2. 案例1:解決兩個浮點數相乘丟失精度問題

// 解決兩個浮點數相乘丟失精度問題
// a: 第一個參數
// b: 第二個參數 
function sum(a, b){
    var weight = 0;
    var aStr = a.toString();
    var bStr = b.toString();
    var regex = /^\d+$/;
    
    if(!regex.test(aStr)){
        weight += aStr.split(".")[1].length; 
        aStr = aStr.replace(".","");
    }
    if(!regex.test(bStr)){
        weight += bStr.split(".")[1].length;
        bStr = bStr.replace(".","");
    }
    return Number(aStr) * Number(bStr) / Math.pow(10, weight);
}

四. 知識點

1.Math.floor()方法執行的是向下取整計算,它返回的是小於或等於函數參數,而且與之最接近的整數。

<script type="text/javascript">

document.write(Math.floor(0.60) + "<br />")
document.write(Math.floor(0.40) + "<br />")
document.write(Math.floor(5) + "<br />")
document.write(Math.floor(5.1) + "<br />")
document.write(Math.floor(-5.1) + "<br />")
document.write(Math.floor(-5.9))

</script>

輸出:

0
0
5
5
-6
-6

五. 學習博文

1. http://www.cnblogs.com/snandy/p/4943138.html

2. http://blog.csdn.net/dclove/article/details/43112839

相關文章
相關標籤/搜索