溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

浮點數(shù)精度丟失問題

發(fā)布時間:2020-09-24 20:22:10 來源:網(wǎng)絡 閱讀:1114 作者:guxianyang 欄目:開發(fā)技術


一. 浮點數(shù)精度丟失的原因

1. 計算機的二進制實現(xiàn)和位數(shù)限制有些數(shù)無法表示。就像一些無理數(shù)不能有限表示,如:圓周率3.1415926...,1.333...等。JS遵循 IEEE 754 規(guī)范,采用雙精度存儲(double precision),占用64bit。如圖:

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

說明:

  • 1位用來表示符號位

  • 11位用來表示指數(shù)

  • 52位表示尾數(shù)

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

詳細了解可以看這篇論文:What Every Computer Scientist Should Know About Floating-Point Arithmetic


二. 浮點數(shù)的加減乘除

1. 兩個浮點數(shù)相乘

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

三. 解決方案

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

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

// 解決兩個浮點數(shù)相乘丟失精度問題
// a: 第一個參數(shù)
// b: 第二個參數(shù) 
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()方法執(zhí)行的是向下取整計算,它返回的是小于或等于函數(shù)參數(shù),并且與之最接近的整數(shù)。

<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


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI