国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript 浮點運算精度問題分析與解決

2024-05-06 16:03:15
字體:
來源:轉載
供稿:網友
浮點數的精度問題不是JavaScript特有的,因為有些小數以二進制表示位數是無窮的

分析

JavaScript 只有一種數字類型 Number ,而且在Javascript中所有的數字都是以IEEE-754標準格式表示的。 浮點數的精度問題不是JavaScript特有的,因為有些小數以二進制表示位數是無窮的:

十進制           二進制
0.1              0.0001 1001 1001 1001 ...
0.2              0.0011 0011 0011 0011 ...
0.3              0.0100 1100 1100 1100 ...
0.4              0.0110 0110 0110 0110 ...
0.5              0.1
0.6              0.1001 1001 1001 1001 ...

所以比如 1.1 ,其程序實際上無法真正的表示 ‘1.1',而只能做到一定程度上的準確,這是無法避免的精度丟失:

1.09999999999999999

在JavaScript中問題還要復雜些,這里只給一些在Chrome中測試數據:

 輸入               輸出
1.0-0.9 == 0.1     False
1.0-0.8 == 0.2     False
1.0-0.7 == 0.3     False
1.0-0.6 == 0.4     True
1.0-0.5 == 0.5     True
1.0-0.4 == 0.6     True
1.0-0.3 == 0.7     True
1.0-0.2 == 0.8     True
1.0-0.1 == 0.9     True

解決

那如何來避免這類 1.0-0.9 != 0.1 的非bug型問題發生呢?下面給出一種目前用的比較多的解決方案, 在判斷浮點運算結果前對計算結果進行精度縮小,因為在精度縮小的過程總會自動四舍五入:

復制代碼 代碼如下:


(1.0-0.9).toFixed(digits)                   // toFixed() 精度參數須在 0 與20 之間
parseFloat((1.0-0.9).toFixed(10)) === 0.1   // 結果為True
parseFloat((1.0-0.8).toFixed(10)) === 0.2   // 結果為True
parseFloat((1.0-0.7).toFixed(10)) === 0.3   // 結果為True
parseFloat((11.0-11.8).toFixed(10)) === -0.8   // 結果為True


方法提煉

復制代碼 代碼如下:


// 通過isEqual工具方法判斷數值是否相等
function isEqual(number1, number2, digits){
 digits = digits == undefined? 10: digits; // 默認精度為10
 return number1.toFixed(digits) === number2.toFixed(digits);
}

isEqual(1.0-0.7, 0.3);  // return true

// 原生擴展方式,更喜歡面向對象的風格
Number.prototype.isEqual = function(number, digits){
 digits = digits == undefined? 10: digits; // 默認精度為10
 return this.toFixed(digits) === number.toFixed(digits);
}

(1.0-0.7).isEqual(0.3); // return true

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 莎车县| 定州市| 古交市| 荆门市| 郧西县| 茂名市| 金坛市| 嘉兴市| 乌什县| 安宁市| 和龙市| 共和县| 霍邱县| 临江市| 遵义县| 康乐县| 山阳县| 化隆| 格尔木市| 镶黄旗| 阿瓦提县| 双鸭山市| 禄丰县| 扎鲁特旗| 建阳市| 五峰| 芦溪县| 桓仁| 台安县| 邵武市| 武穴市| 湄潭县| 会理县| 定结县| 冕宁县| 巨鹿县| 饶平县| 普陀区| 舒城县| 永吉县| 嘉兴市|