欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript 浮點(diǎn)運(yùn)算精度問題分析與解決

 更新時(shí)間:2014年03月26日 11:46:11   作者:  
浮點(diǎn)數(shù)的精度問題不是JavaScript特有的,因?yàn)橛行┬?shù)以二進(jìn)制表示位數(shù)是無窮的

分析

JavaScript 只有一種數(shù)字類型 Number ,而且在Javascript中所有的數(shù)字都是以IEEE-754標(biāo)準(zhǔn)格式表示的。 浮點(diǎn)數(shù)的精度問題不是JavaScript特有的,因?yàn)橛行┬?shù)以二進(jìn)制表示位數(shù)是無窮的:

十進(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上無法真正的表示 ‘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ā)生呢?下面給出一種目前用的比較多的解決方案, 在判斷浮點(diǎn)運(yùn)算結(jié)果前對計(jì)算結(jié)果進(jìn)行精度縮小,因?yàn)樵诰瓤s小的過程總會自動四舍五入:

復(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

// 原生擴(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)文章

  • JS根據(jù)變量保存方法名并執(zhí)行方法示例

    JS根據(jù)變量保存方法名并執(zhí)行方法示例

    用eval方法,把傳進(jìn)來的這個(gè)方法名所代表的方法當(dāng)作一個(gè)對象來賦值給method1的func屬性,需要的朋友可以參考下
    2014-04-04
  • 仿google adsense顏色選擇器代碼,從中易廣告聯(lián)盟程序提取

    仿google adsense顏色選擇器代碼,從中易廣告聯(lián)盟程序提取

    仿google adsense顏色選擇器代碼,從中易廣告聯(lián)盟程序提取...
    2007-11-11
  • 讓圖片跳躍起來  javascript圖片輪播特效

    讓圖片跳躍起來 javascript圖片輪播特效

    讓圖片跳躍起來 這篇文章主要介紹了javascript圖片輪播特效,圖片按照間隔時(shí)間進(jìn)行切換,文章具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 通過微信公眾平臺獲取公眾號文章的方法示例

    通過微信公眾平臺獲取公眾號文章的方法示例

    這篇文章主要介紹了通過微信公眾平臺獲取公眾號文章的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 簡單實(shí)現(xiàn)js無縫滾動效果

    簡單實(shí)現(xiàn)js無縫滾動效果

    這篇文章主要教大家如何簡單實(shí)現(xiàn)js無縫滾動效果,js輪播圖實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • p5.js入門教程之圖片加載

    p5.js入門教程之圖片加載

    這篇文章主要介紹了p5.js入門教程之圖片加載,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 微信小程序?qū)崿F(xiàn)簡單搜索框

    微信小程序?qū)崿F(xiàn)簡單搜索框

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡單搜索框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 5分鐘快速搭建vue3+ts+vite+pinia項(xiàng)目

    5分鐘快速搭建vue3+ts+vite+pinia項(xiàng)目

    本文主要介紹了5分鐘快速搭建vue3+ts+vite+pinia項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • JS實(shí)現(xiàn)將對象轉(zhuǎn)化為數(shù)組的方法分析

    JS實(shí)現(xiàn)將對象轉(zhuǎn)化為數(shù)組的方法分析

    這篇文章主要介紹了JS實(shí)現(xiàn)將對象轉(zhuǎn)化為數(shù)組的方法,結(jié)合實(shí)例形式分析了javascript操作及轉(zhuǎn)換json數(shù)組相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01
  • js中如何對json數(shù)組進(jìn)行排序

    js中如何對json數(shù)組進(jìn)行排序

    這篇文章主要介紹了js中如何對json數(shù)組進(jìn)行排序的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論