javascript中0.1+0.2背后的原理

浮點(diǎn)數(shù)的存儲(chǔ)

首先要搞清楚javascript如何存儲(chǔ)小數(shù)的壁袄,它和其他語言存儲(chǔ),javascript中的整數(shù)和小數(shù)都只有一種類型--number,它的實(shí)現(xiàn)遵循 IEEE 754 標(biāo)準(zhǔn)轩褐,使用 64 位固定長度來表示,也就是標(biāo)準(zhǔn)的 double 雙精度浮點(diǎn)數(shù)狞洋。

格式

(1)sign bit(符號): 第1位用來表示正負(fù)號纲辽,0代表數(shù)值為正,1代表數(shù)值為負(fù)您觉。
(2)exponent(指數(shù)): 中間的11位用來表示次方數(shù)拙寡。
(3)mantissa(尾數(shù)):最后的52位用來表示精確度,在二進(jìn)制的“科學(xué)記號”琳水,數(shù)字被表示為:Mantissa*2^exponent肆糕,超出的部分自動(dòng)進(jìn)一舍零。

實(shí)際數(shù)字就可以用以下公式來計(jì)算:

注意以上的公式遵循科學(xué)計(jì)數(shù)法的規(guī)范在孝,在十進(jìn)制是為0<M<10诚啃,到二進(jìn)行就是0<M<2。也就是說整數(shù)部分只能是1私沮,所以可以被舍去始赎,只保留后面的小數(shù)部分。如 4.5 轉(zhuǎn)換成二進(jìn)制就是 100.1仔燕,科學(xué)計(jì)數(shù)法表示是 1.001*2^2造垛,舍去1后 M = 001。E是一個(gè)無符號整數(shù)晰搀,因?yàn)殚L度是11位五辽,取值范圍是 0~2047。但是科學(xué)計(jì)數(shù)法中的指數(shù)是可以為負(fù)數(shù)的外恕,所以再減去一個(gè)中間數(shù) 1023杆逗,[0,1022]表示為負(fù)乡翅,[1024,2047] 表示為正。如4.5 的指數(shù)E = 1025罪郊,尾數(shù)M為 001蠕蚜。

最終的公式變成:

所以 4.5 最終表示為(M=001、E=1025):


下面再以 0.1 例解釋浮點(diǎn)誤差的原因排龄, 0.1 轉(zhuǎn)成二進(jìn)制表示為 0.0001100110011001100(1100循環(huán))波势,1.100110011001100x2^-4,所以 E=-4+1023=1019橄维;M 舍去首位的1尺铣,得到 100110011...。最終就是:



轉(zhuǎn)化成十進(jìn)制后為 0.100000000000000005551115123126争舞,因此就出現(xiàn)了浮點(diǎn)誤差凛忿。

為什么 0.1+0.2=0.30000000000000004?

計(jì)算步驟為:

// 0.1 和 0.2 都轉(zhuǎn)化成二進(jìn)制后再進(jìn)行運(yùn)算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

// 轉(zhuǎn)成十進(jìn)制正好是 0.30000000000000004

詳細(xì)請看這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竞川,一起剝皮案震驚了整個(gè)濱河市店溢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌委乌,老刑警劉巖床牧,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遭贸,居然都是意外死亡戈咳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門壕吹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著蛙,“玉大人,你說我怎么就攤上這事耳贬√けぃ” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵咒劲,是天一觀的道長顷蟆。 經(jīng)常有香客問我,道長腐魂,這世上最難降的妖魔是什么慕的? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挤渔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘风题。我一直安慰自己判导,他們只是感情好嫉父,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眼刃,像睡著了一般绕辖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擂红,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天仪际,我揣著相機(jī)與錄音,去河邊找鬼昵骤。 笑死树碱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的变秦。 我是一名探鬼主播成榜,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦玫!你這毒婦竟也來了赎婚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤樱溉,失蹤者是張志新(化名)和其女友劉穎挣输,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體福贞,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撩嚼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肚医。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绢馍。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肠套,靈堂內(nèi)的尸體忽然破棺而出舰涌,到底是詐尸還是另有隱情,我是刑警寧澤你稚,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布瓷耙,位于F島的核電站,受9級特大地震影響刁赖,放射性物質(zhì)發(fā)生泄漏搁痛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一宇弛、第九天 我趴在偏房一處隱蔽的房頂上張望鸡典。 院中可真熱鬧,春花似錦枪芒、人聲如沸彻况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纽甘。三九已至良蛮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悍赢,已是汗流浹背决瞳。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留左权,地道東北人皮胡。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像涮总,于是被迫代替她去往敵國和親胸囱。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容