JS 0.1+0.2的理解

JS紅皮書里面介紹浮點數(shù)值時有提到,0.1+0.2結果不是0.3货岭,而是0.30000000000000004。對于非計算機專業(yè)的我而言疾渴,當時看到這句話一臉茫然千贯。

為了解除心中的疑惑,在網(wǎng)上看了很多文章搞坝,才弄懂其中的原理搔谴,在這里記錄下來。

  1. 對于計算機而言桩撮,兩個數(shù)字在相加時是以二進制形式進行的敦第,在呈現(xiàn)結果時才轉換成十進制峰弹。JS中的數(shù)字是用IEEE 754 雙精度 64 位浮點數(shù)來存儲的,它由64位組成芜果,這64位由3部分組成鞠呈,(S:符號位,Exponent:指數(shù)域师幕,F(xiàn)raction:尾數(shù)域)粟按。
    具體結構如下圖:

2.十進制小數(shù)轉換為二進制小數(shù):用2乘十進制小數(shù),可以得到積霹粥,將積的整數(shù)部分取出灭将,再用2乘余下的小數(shù)部分,又得到一個積后控,再將積的整數(shù)部分取出庙曙,如此進行,直到積中的小數(shù)部分為零浩淘,此時0或1為二進制的最后一位捌朴。或者達到所要求的精度為止张抄。

如:0.7=(0.1 0110 0110...)B
0.7*2=1.4========取出整數(shù)部分1
0.4*2=0.8========取出整數(shù)部分0
0.8*2=1.6========取出整數(shù)部分1
0.6*2=1.2========取出整數(shù)部分1
0.2*2=0.4========取出整數(shù)部分0
0.4*2=0.8========取出整數(shù)部分0
0.8*2=1.6========取出整數(shù)部分1
0.6*2=1.2========取出整數(shù)部分1
0.2*2=0.4========取出整數(shù)部分0

 // 0.1 轉化為二進制
0.0 0011 0011 0011 0011...(0011無限循環(huán))

// 0.2 轉化為二進制
0.0011 0011 0011 0011 0011...(0011無限循環(huán))

由于尾數(shù)只有52位砂蔽,所以對于0.1和0.2轉換后的二進制如下:

e = -4; m =1.1001100110011001100110011001100110011001100110011010 (52位)
e = -3; m =1.1001100110011001100110011001100110011001100110011010 (52位)

像十進制數(shù)有4舍5入的規(guī)則一樣,二進制也存在類似的規(guī)則署惯,簡單的說左驾,如果 1.101 
要保留一位小數(shù),可能的值是 1.1 和 1.2极谊,那么先看 1.101 和 1.1 或者 1.2 哪個值更
接近诡右,毫無疑問是 1.1,于是答案是 1.1轻猖。那么如果要保留兩位小數(shù)呢帆吻?很顯然要么
是 1.10 要么是 1.11,而且又一樣近咙边,這時就要看這兩個數(shù)哪個是偶數(shù)(末位是偶
數(shù))猜煮,保留偶數(shù)為答案。綜上败许,如果第 52 bit 和 53 bit 都是 1友瘤,那么是要進位的。
這也導致了誤差的產生檐束。
  1. 我們看下這兩個二進制相加
  e = -4; m = 1.1001100110011001100110011001100110011001100110011010 (52位)
+ e = -3; m = 1.1001100110011001100110011001100110011001100110011010 (52位)
---------------------------------------------------------------------------
相加時如果指數(shù)不一致辫秧,需要對齊,一般情況下是向右移被丧,因為最右邊的即使溢出了盟戏,損失的精度遠遠小于左邊溢出绪妹。
  e = -3; m = 0.1100110011001100110011001100110011001100110011001101 
+ e = -3; m = 1.1001100110011001100110011001100110011001100110011010
---------------------------------------------------------------------------
  e = -3; m = 10.0110011001100110011001100110011001100110011001100111
---------------------------------------------------------------------------
  e = -2; m = 1.0011001100110011001100110011001100110011001100110100(52位)
---------------------------------------------------------------------------
= 0.010011001100110011001100110011001100110011001100110100
= 0.30000000000000004(十進制)

總結:我們可以看到,當十進制小數(shù)的二進制表示的有限數(shù)字超過 52 位時柿究,在 JavaScript 里是不能精確存儲的邮旷,這時候就存在舍入誤差(Round-off error)。

參考:
JavaScript 中小數(shù)和大整數(shù)的精度丟失

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蝇摸,一起剝皮案震驚了整個濱河市婶肩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌貌夕,老刑警劉巖律歼,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啡专,居然都是意外死亡险毁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門们童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畔况,“玉大人,你說我怎么就攤上這事慧库□喂颍” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵齐板,是天一觀的道長吵瞻。 經(jīng)常有香客問我,道長覆积,這世上最難降的妖魔是什么听皿? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任熟呛,我火速辦了婚禮宽档,結果婚禮上,老公的妹妹穿的比我還像新娘庵朝。我一直安慰自己吗冤,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布九府。 她就那樣靜靜地躺著椎瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侄旬。 梳的紋絲不亂的頭發(fā)上肺蔚,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音儡羔,去河邊找鬼宣羊。 笑死璧诵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的仇冯。 我是一名探鬼主播之宿,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苛坚!你這毒婦竟也來了比被?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泼舱,失蹤者是張志新(化名)和其女友劉穎等缀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠掂,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡项滑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涯贞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枪狂。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宋渔,靈堂內的尸體忽然破棺而出州疾,到底是詐尸還是另有隱情,我是刑警寧澤皇拣,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布严蓖,位于F島的核電站,受9級特大地震影響氧急,放射性物質發(fā)生泄漏颗胡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一吩坝、第九天 我趴在偏房一處隱蔽的房頂上張望毒姨。 院中可真熱鬧,春花似錦钉寝、人聲如沸弧呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俘枫。三九已至,卻和暖如春逮走,著一層夾襖步出監(jiān)牢的瞬間鸠蚪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茅信,地道東北人酣栈。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像汹押,于是被迫代替她去往敵國和親矿筝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354