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

首頁 > 編程 > JavaScript > 正文

Javascript 浮點運算的問題分析與解決方法

2019-11-20 22:21:45
字體:
供稿:網(wǎng)友

十進制           二進制
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 ,其程序?qū)嶋H上無法真正的表示 ‘1.1',而只能做到一定程度上的準確,這是無法避免的精度丟失:

1.09999999999999999
在JavaScript中問題還要復雜些,這里只給一些在Chrome中測試數(shù)據(jù):

 輸入               輸出
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型問題發(fā)生呢?下面給出一種目前用的比較多的解決方案, 在判斷浮點運算結(jié)果前對計算結(jié)果進行精度縮小,因為在精度縮小的過程總會自動四舍五入:

復制代碼 代碼如下:

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

方法提煉
復制代碼 代碼如下:

// 通過isEqual工具方法判斷數(shù)值是否相等
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

// 原生擴展方式,更喜歡面向?qū)ο蟮娘L格
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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德化县| 镇巴县| 清丰县| 天峻县| 疏附县| 安仁县| 台北县| 聂拉木县| 慈利县| 睢宁县| 乾安县| 同江市| 巴彦县| 阿尔山市| 海城市| 孙吴县| 霍州市| 舒兰市| 高邮市| 锡林郭勒盟| 成都市| 正宁县| 沐川县| 昌乐县| 搜索| 田东县| 通道| 江孜县| 绥德县| 蒲江县| 凤阳县| 垣曲县| 海淀区| 昌都县| 白河县| 石台县| 井研县| 龙里县| 正蓝旗| 洛川县| 武平县|