中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

淺談JavaScript中小數和大整數的精度丟失
來源:易賢網 閱讀:1821 次 日期:2016-06-17 16:13:24
溫馨提示:易賢網小編為您整理了“淺談JavaScript中小數和大整數的精度丟失”,方便廣大網友查閱!

下面小編就為大家帶來一篇淺談JavaScript中小數和大整數的精度丟失。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。

先來看兩個問題:

0.1 + 0.2 == 0.3; // false

9999999999999999 == 10000000000000000; // true

第一個問題是小數的精度問題,在業界不少博客里已有討論。第二個問題,去年公司有個系統的數據庫在做數據訂正時,發現有部分數據重復的詭異現象。本文將從規范出發,對上面的問題做個小結。

最大整數

JavaScript 中的數字是用 IEEE 754 雙精度 64 位浮點數 來存儲的,其格式為:

s x m x 2^e

s 是符號位,表示正負。 m 是尾數,有 52 bits. e 是指數,有 11 bits. 在 ECMAScript 規范 里有給出 e 的范圍為 [-1074, 971]. 這樣,很容易推導出 JavaScript 能表示的最大整數為:

1 x (2^53 - 1) x 2^971 = 1.7976931348623157e+308

這個值正是 Number.MAX_VALUE

同理可推導出 Number.MIN_VALUE 的值為:

1 x 1 x 2^(-1074) = 5e-324

注意 MIN_VALUE 表示最接近 0 的正數,而不是最小的數。最小的數是 -Number.MAX_VALUE

小數的精度丟失

JavaScript 的數字都是雙精度浮點數,在計算機里用二進制存儲。當有效位數超過 52 位時,會存在精度丟失。比如:

十進制 0.1 的二進制為 0.0 0011 0011 0011 … (循環 0011)

十進制 0.2 的二進制為 0.0011 0011 0011 … (循環 0011)

0.1 + 0.2 相加可表示為:

   e = -4; m = 1.10011001100...1100(52 位)

 + e = -3; m = 1.10011001100...1100(52 位)

---------------------------------------------

   e = -3; m = 0.11001100110...0110

 + e = -3; m = 1.10011001100...1100

---------------------------------------------

   e = -3; m = 10.01100110011...001

---------------------------------------------

 = 0.01001100110011...001

 = 0.30000000000000004(十進制)

根據上面的演算,還可以得出一個結論:當十進制小數的二進制表示的有限數字不超過 52 位時,在 JavaScript 里是可以精確存儲的。比如:

0.05 + 0.005 == 0.055 // true

進一步的規律,比如:

0.05 + 0.2 == 0.25 // true

0.05 + 0.9 == 0.95 // false

需要考慮 IEEE 754 的 Rounding modes, 有興趣的可進一步研究。

大整數的精度丟失

這個問題鮮有人提及。首先得弄清楚問題是什么:

1. JavaScript 能存儲的最大整數是什么?

該問題前面已回答,是 Number.MAX_VALUE, 非常大的一個數。

2. JavaScript 能存儲的且不丟失精度的最大整數是什么?

根據 s x m x 2^e, 符號位取正,52 位尾數全填充 1, 指數 e 取最大值 971, 顯然,答案依舊是 Number.MAX_VALUE.

我們的問題究竟是什么呢?回到起始代碼:

9999999999999999 == 10000000000000000; // true

很明顯,16 個 9 還遠遠小于 308 個 10. 這個問題與 MAX_VALUE 沒什么關系,還得歸屬到尾數 m 只有 52 位上來。

可以用代碼來描述:

var x = 1; // 為了減少運算量,初始值可以設大一點,比如 Math.pow(2, 53) - 10

while(x != x + 1) x++;

// x = 9007199254740992 即 2^53

也就是說,當 x 小于等于 2^53 時,可以確保 x 的精度不會丟失。當 x 大于 2^53 時,x 的精度有可能會丟失。比如:

x 為 2^53 + 1 時,其二進制表示為:

10000000000...001 (中間共有 52 個 0)

用雙精度浮點數存儲時:

e = 1; m = 10000..00(共 52 個 0,其中 1 是 hidden bit)

顯然,這和 2^53 的存儲是一樣的。

按照上面的思路可以推出,對于 2^53 + 2, 其二進制為 100000…0010(中間 51 個 0),也是可以精確存儲的。

規律:當 x 大于 2^53 且二進制有效位數大于 53 位時,就會存在精度丟失。這和小數的精度丟失本質上是一樣的。

hidden bit 可參考:A tutorial about Java double type.

小結

小數和大整數的精度丟失,并不僅僅在 JavaScript 中存在。嚴格來說,使用了IEEE 754 浮點數格式來存儲浮點類型的任何編程語言(C/C++/C#/Java 等等)都存在精度丟失問題。在 C#、Java 中,提供了 Decimal、BigDecimal 封裝類來進行相應的處理,才避開了精度丟失。

注:ECMAScript 規范中,已有  decimal proposal,但目前尚未被正式采納。

最后考考大家:

Number.MAX_VALUE + 1 == Numer.MAX_VALUE;

Number.MAX_VALUE + 2 == Numer.MAX_VALUE;

...

Number.MAX_VALUE + x == Numer.MAX_VALUE;

Number.MAX_VALUE + x + 1 == Infinity;

...

Number.MAX_VALUE + Number.MAX_VALUE == Infinity;

// 問題:

// 1. x 的值是什么?

// 2. Infinity - Number.MAX_VALUE == x + 1; 是 true 還是 false ?

以上這篇淺談JavaScript中小數和大整數的精度丟失就是小編分享給大家的全部內容了,希望能給大家一個參考

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美日韩在线亚洲一区蜜芽| 亚洲日本va在线观看| 欧美日韩精品一区视频| 国产精品一区在线观看| 国产精品ⅴa在线观看h| 亚洲免费视频网站| 欧美一区二区三区在| 精东粉嫩av免费一区二区三区| 亚洲承认在线| 一区二区三区免费网站| 国产视频久久久久久久| 欧美绝品在线观看成人午夜影视| 久久精品在线观看| av成人动漫| 亚洲欧洲日本一区二区三区| 国产精品青草久久| 欧美四级电影网站| 欧美日韩亚洲另类| 欧美一区午夜精品| 亚洲一区在线播放| 国产亚洲欧洲997久久综合| 在线亚洲高清视频| 亚洲精品日韩在线观看| 国内精品视频一区| 国产精品爱啪在线线免费观看| 欧美高清不卡| 久久久亚洲高清| 亚洲综合日韩在线| 亚洲高清免费在线| 国产精品稀缺呦系列在线| 久久黄色小说| 欧美在线视频日韩| 国产综合视频| 一区二区在线看| 亚洲一区二区视频在线观看| 欧美午夜宅男影院在线观看| 欧美日韩日本视频| 亚洲欧美亚洲| 亚洲国产mv| 亚洲国产天堂网精品网站| 国产亚洲欧洲一区高清在线观看 | 亚洲综合精品| 欧美a级一区二区| 激情国产一区二区| 国产三级精品三级| 亚洲欧美国产毛片在线| 欧美激情精品久久久六区热门| 国产精品一区免费视频| 亚洲视频在线二区| 欧美日韩a区| 亚洲一区在线视频| 欧美另类一区| 一区二区三区欧美亚洲| 国产精品久久久久久亚洲调教| 99re热精品| 国产一区二区三区在线观看网站 | 午夜国产欧美理论在线播放| 国产老女人精品毛片久久| 蜜桃av久久久亚洲精品| 中日韩高清电影网| 在线免费观看成人网| 国产欧美日韩另类一区| 欧美天堂在线观看| 欧美国产一区二区| 欧美一区二区三区在线观看| 日韩一级成人av| 亚洲电影免费在线| 国产专区综合网| 欧美色欧美亚洲另类七区| 国产精品mm| 国产精品v欧美精品∨日韩| 欧美成人精品在线| 麻豆久久婷婷| 久久综合色8888| 欧美在线观看一区二区| 麻豆精品在线观看| 欧美成在线视频| 欧美亚洲成人免费| 国产精品v日韩精品| 欧美日韩中文字幕综合视频| 国产精品视频yy9299一区| 国产精品中文字幕欧美| 国内精品久久国产| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产精品久久91精品| 99re66热这里只有精品4| 久久九九免费视频| 国产精品国产三级国产专播品爱网| 国内偷自视频区视频综合| 欧美成人激情在线| 亚洲欧洲一区二区三区久久| 午夜精品理论片| 国产视频一区在线观看| 久久在线免费观看| 夜夜嗨av一区二区三区中文字幕| 国产精品一区二区在线观看网站| 亚洲一品av免费观看| 国产一区视频网站| 欧美大色视频| 伊人久久综合97精品| 91久久线看在观草草青青| 在线观看精品视频| 亚洲视频碰碰| 欧美激情一区二区在线| 在线日本高清免费不卡| 一区国产精品| 新狼窝色av性久久久久久| 一区二区三区不卡视频在线观看| 亚洲一二三四区| 欧美精品免费看| 日韩网站在线观看| 麻豆91精品| 亚洲国产高清视频| 久久这里有精品视频| 尤物在线精品| 欧美激情综合五月色丁香小说| 亚洲精品视频一区二区三区| 欧美大胆人体视频| 亚洲手机成人高清视频| 国产精品一区二区在线| 久久久久国产精品午夜一区| 揄拍成人国产精品视频| 米奇777超碰欧美日韩亚洲| 韩国精品在线观看| 欧美日韩三级视频| 久久精品99国产精品酒店日本| 亚洲电影第三页| 精品1区2区3区4区| 国产精品在线看| 免费亚洲电影在线| 亚洲电影自拍| 国产麻豆午夜三级精品| 欧美日韩国产区一| 欧美福利一区二区| 久久亚洲精选| 亚洲在线一区二区| 一本在线高清不卡dvd| 亚洲成在人线av| 一本一道久久综合狠狠老精东影业 | 亚洲欧美色一区| 亚洲国产mv| 在线成人黄色| 韩国一区二区三区美女美女秀| 欧美午夜片在线观看| 欧美激情视频网站| 狼人天天伊人久久| 欧美成人午夜77777| 欧美在线播放| 久久综合九色综合欧美狠狠| 久久综合九色欧美综合狠狠| 性欧美1819性猛交| 小黄鸭精品密入口导航| 欧美精品www| a4yy欧美一区二区三区| 一本色道久久综合亚洲精品按摩 | 一区二区三区自拍| 国产午夜精品一区二区三区欧美| 欧美日韩一卡二卡| 国产精品大全| 欧美激情一区在线| 国产精品午夜视频| 国产一区二区三区电影在线观看| 欧美日韩在线播放三区| 国产日韩欧美中文| 亚洲精品国精品久久99热| 亚洲欧美日韩在线观看a三区| 欧美xx视频| 精品1区2区3区4区| 一区二区三区国产盗摄| 欧美精品在线一区二区| 亚洲国产美女精品久久久久∴| 欧美中文在线观看| 欧美剧在线观看| 日韩一级黄色av| 欧美视频中文在线看| 亚洲毛片一区二区| 欧美日韩视频一区二区三区| 亚洲一区二区三区涩| 欧美三级在线播放| 亚洲免费精彩视频| 亚洲欧美色一区| 欧美激情在线观看| 国产在线精品一区二区夜色| 亚洲精品日本| 国产精品在线看| 亚洲精品五月天| 久久精品国产免费看久久精品| 欧美日韩免费一区| 国产日韩在线播放| 亚洲一区二区在线| 欧美日韩精品伦理作品在线免费观看 | 欧美三级电影一区| 99国产精品自拍| 久久亚洲私人国产精品va| 国产日韩欧美中文| 午夜国产精品视频| 国产一区二区三区日韩| 久久精品日韩一区二区三区| 激情五月婷婷综合| 美女被久久久|