最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年08月27日 15:00:24   作者:  
JavaScript 只有一種數(shù)字類型 Number ,而且在Javascript中所有的數(shù)字都是以IEEE-754標準格式表示的。 浮點數(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 ,其程序實際上無法真正的表示 ‘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ā)生呢?下面給出一種目前用的比較多的解決方案, 在判斷浮點運算結果前對計算結果進行精度縮小,因為在精度縮小的過程總會自動四舍五入:

復制代碼 代碼如下:

(1.0-0.9).toFixed(digits)                   // toFixed() 精度參數(shù)須在 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工具方法判斷數(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

// 原生擴展方式,更喜歡面向對象的風格
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

相關文章

最新評論

连州市| 拜泉县| 正阳县| 廊坊市| 泸水县| 莆田市| 米泉市| 洮南市| 扎囊县| 泰州市| 汕头市| 定西市| 榕江县| 苍溪县| 读书| 玉田县| 常山县| 锦屏县| 临海市| 哈密市| 民县| 开远市| 信丰县| 林周县| 怀来县| 邵东县| 祁东县| 钟山县| 岳阳县| 道孚县| 车险| 开鲁县| 定襄县| 闵行区| 三门县| 七台河市| 洪雅县| 高雄县| 平山县| 涞源县| 屯门区|