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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:51:11
字體:
供稿:網(wǎng)友
JavaScript 只有一種數(shù)字類型 Number ,而且在Javascript中所有的數(shù)字都是以IEEE-754標(biāo)準(zhǔn)格式表示的。 浮點數(shù)的精度問題不是JavaScript特有的,因為有些小數(shù)以二進制表示位數(shù)是無窮的

十進制           二進制
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',而只能做到一定程度上的準(zhǔn)確,這是無法避免的精度丟失:

1.09999999999999999
在JavaScript中問題還要復(fù)雜些,這里只給一些在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é)果進行精度縮小,因為在精度縮小的過程總會自動四舍五入:

復(fù)制代碼 代碼如下:


(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


方法提煉

復(fù)制代碼 代碼如下:


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

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

// 原生擴展方式,更喜歡面向?qū)ο蟮娘L(fēng)格
Number.prototype.isEqual = function(number, digits){
 digits = digits == undefined? 10: digits; // 默認(rèn)精度為10
 return this.toFixed(digits) === number.toFixed(digits);
}

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

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

圖片精選

主站蜘蛛池模板: 垫江县| 马山县| 景德镇市| 金阳县| 敖汉旗| 东乌| 萝北县| 大足县| 舟曲县| 荆州市| 呼图壁县| 三穗县| 鹰潭市| 台山市| 浪卡子县| 来宾市| 中方县| 合作市| 若尔盖县| 武冈市| 岳西县| 广灵县| 互助| 鞍山市| 黔江区| 屏南县| 剑川县| 宜阳县| 玉屏| 奉化市| 招远市| 宁国市| 巫山县| 天峨县| 凯里市| 琼中| 长宁县| 绥滨县| 朝阳县| 岑巩县| 宣汉县|