Javascript 浮點(diǎn)運(yùn)算的問(wèn)題分析與解決方法
十進(jìn)制 二進(jìn)制
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上無(wú)法真正的表示 ‘1.1',而只能做到一定程度上的準(zhǔn)確,這是無(wú)法避免的精度丟失:
1.09999999999999999
在JavaScript中問(wèn)題還要復(fù)雜些,這里只給一些在Chrome中測(cè)試數(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
解決
那如何來(lái)避免這類 1.0-0.9 != 0.1 的非bug型問(wèn)題發(fā)生呢?下面給出一種目前用的比較多的解決方案, 在判斷浮點(diǎn)運(yùn)算結(jié)果前對(duì)計(jì)算結(jié)果進(jìn)行精度縮小,因?yàn)樵诰瓤s小的過(guò)程總會(huì)自動(dòng)四舍五入:
(1.0-0.9).toFixed(digits) // toFixed() 精度參數(shù)須在 0 與20 之間
parseFloat((1.0-0.9).toFixed(10)) === 0.1 // 結(jié)果為T(mén)rue
parseFloat((1.0-0.8).toFixed(10)) === 0.2 // 結(jié)果為T(mén)rue
parseFloat((1.0-0.7).toFixed(10)) === 0.3 // 結(jié)果為T(mén)rue
parseFloat((11.0-11.8).toFixed(10)) === -0.8 // 結(jié)果為T(mén)rue
方法提煉
// 通過(guò)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
// 原生擴(kuò)展方式,更喜歡面向?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
相關(guān)文章
javascript下過(guò)濾數(shù)組重復(fù)值的代碼
javascript下過(guò)濾數(shù)組重復(fù)值的代碼...2007-09-09
js實(shí)現(xiàn)點(diǎn)擊鏈接后延遲3秒再跳轉(zhuǎn)的方法
這篇文章主要介紹了js實(shí)現(xiàn)點(diǎn)擊鏈接后延遲3秒再跳轉(zhuǎn)的方法,通過(guò)javascript的setTimeout方法實(shí)現(xiàn)延遲跳轉(zhuǎn)的功能,需要的朋友可以參考下2015-06-06
最常見(jiàn)和最有用的字符串相關(guān)的方法詳解
本文主要介紹了最常見(jiàn)和最有用的字符串相關(guān)的方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
原生js結(jié)合html5制作簡(jiǎn)易的雙色子游戲
這篇文章主要介紹了原生js結(jié)合html5制作簡(jiǎn)易的雙色子游戲的代碼,是個(gè)人學(xué)習(xí)練手用的,雖然寫(xiě)的不太好,還是分享給大家,有需要的小伙伴可以參考下。2015-03-03
javascript創(chuàng)建createXmlHttpRequest對(duì)象示例代碼
這篇文章主要介紹了javascript創(chuàng)建createXmlHttpRequest對(duì)象的示例代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
微信小程序?qū)崿F(xiàn)簡(jiǎn)單購(gòu)物車(chē)功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)單購(gòu)物車(chē)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
ZK中使用JS讀取客戶端txt文件內(nèi)容問(wèn)題
這篇文章主要介紹了ZK中使用JS讀取客戶端txt文件內(nèi)容問(wèn)題,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
JavaScript實(shí)現(xiàn)移動(dòng)端簽字功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)移動(dòng)端簽字功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

