成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

0.1 + 0.2 != 0.3背后的原理

阿羅 / 528人閱讀

摘要:標(biāo)準(zhǔn)是浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)的標(biāo)準(zhǔn)編號(hào),等同于國(guó)際標(biāo)準(zhǔn)。標(biāo)準(zhǔn)規(guī)定了計(jì)算機(jī)程序設(shè)計(jì)環(huán)境中的二進(jìn)制和十進(jìn)制的浮點(diǎn)數(shù)之間的交換算術(shù)格式以及方法。

初學(xué)JavaScript,在進(jìn)行小數(shù)(浮點(diǎn)數(shù))運(yùn)算時(shí),經(jīng)常會(huì)碰到這樣的情況:0.1 + 0.2=0.30000000000000004,記得當(dāng)時(shí),教程告訴我們說(shuō),0.1 + 0.2在JavaScript運(yùn)算中,它的值是不固定的,可以在后面學(xué)習(xí)和試驗(yàn)中,漸漸發(fā)現(xiàn),這個(gè)值似乎每次都是0.30000000000000004,于是漸漸懷疑當(dāng)時(shí)學(xué)習(xí)過(guò)程中關(guān)于它的和值是不固定的說(shuō)法。

其實(shí)有一定編程基礎(chǔ)的同學(xué)們應(yīng)該都知道,計(jì)算機(jī)是采用二進(jìn)制來(lái)表示十進(jìn)制的,規(guī)則是:整數(shù)除以2,商繼續(xù)除以2,得到0為止,將余數(shù)逆序排列;小數(shù)乘以2,取整,小數(shù)部分繼續(xù)乘以2,取整,得到小數(shù)部分0為止,將整數(shù)順序排列。例如:

其實(shí)不管是十進(jìn)制轉(zhuǎn)二進(jìn)制還是八進(jìn)制、十六進(jìn)制,原理都是一樣的,即,基數(shù)連連除(整數(shù))或者連乘(小數(shù))

再回到我們最初的問(wèn)題, JS 采用 IEEE 754 雙精度版本(64位),并且只要采用 IEEE 754 的語(yǔ)言都有前面的問(wèn)題。

IEEE 754 標(biāo)準(zhǔn)是IEEE浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE Standard for Floating-Point Arithmetic)的標(biāo)準(zhǔn)編號(hào) ,等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC/IEEE 60559 。IEEE 754 標(biāo)準(zhǔn)規(guī)定了計(jì)算機(jī)程序設(shè)計(jì)環(huán)境中的二進(jìn)制和十進(jìn)制的浮點(diǎn)數(shù)之間的交換、算術(shù)格式以及方法 。

根據(jù)前面介紹的知識(shí),0.1 的二進(jìn)制表示為:

0.1 = 2^-4 * 1.10011(0011)// (0011) 表示循環(huán)

0.2 的二進(jìn)制表示為:

0.2 = 2^-3 * 1.10011(0011)// (0011) 表示循環(huán)

前面說(shuō)了,JS 采用 IEEE 754 雙精度版本(64位),六十四位中符號(hào)位占一位,整數(shù)位占十一位,其余五十二位都為小數(shù)位。因?yàn)?0.1 和 0.2 都是無(wú)限循環(huán)的二進(jìn)制,所以在小數(shù)位末尾處需要判斷是否進(jìn)位(規(guī)則和十進(jìn)制里的四舍五入一樣)。
所以 0.1的二進(jìn)制表示(0.1 = 2^-4 * 1.10011(0011)) 進(jìn)位后就變成了 2^-4 * 1.10011(0011 * 12次)010,同理可得0.2的二進(jìn)制表示 。把這兩個(gè)二進(jìn)制加起來(lái)得到 2^-2 * 1.0011(0011 * 11次)0100 , 這個(gè)值再換算成十進(jìn)制就是 0.30000000000000004。

所以說(shuō),0.1 + 0.2=0.30000000000000004,在JavaScript中,它的結(jié)果并非不固定的。

那么,如果需要比較0.1 + 0.20.3的關(guān)系,我們又該如何進(jìn)行呢?
其實(shí)對(duì)于在大學(xué)學(xué)過(guò)數(shù)學(xué)分析、數(shù)值逼近或者高中課程代數(shù)方面證明知識(shí)的同學(xué)來(lái)說(shuō),自然可以想到讓0.1 + 0.2的和減去0.3小于一個(gè)任意小的數(shù),比如說(shuō)我們可以通過(guò)他們差值是否小于0.0000000001來(lái)判斷他們是否相等。JavaScript也提供了一些原生的方法,比如toFixed() 方法可把 Number 四舍五入為指定小數(shù)位數(shù)的數(shù)字,語(yǔ)法:NumberObject.toFixed(num)

參數(shù)描述:num,必需。規(guī)定小數(shù)的位數(shù),是 0 ~ 20 之間的值,包括 0 和 20,有些實(shí)現(xiàn)可以支持更大的數(shù)值范圍。如果省略了該參數(shù),將用 0 代替。

參考內(nèi)容:JavaScript toFixed() 方法
幾道高級(jí)前端面試題解析

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95315.html

相關(guān)文章

  • 為什么0.1+0.2不等于0.3

    摘要:又如,對(duì)于,結(jié)果其實(shí)并不是,但是最接近真實(shí)結(jié)果的數(shù),比其它任何浮點(diǎn)數(shù)都更接近。許多語(yǔ)言也就直接顯示結(jié)果為了,而不展示一個(gè)浮點(diǎn)數(shù)的真實(shí)結(jié)果了。小結(jié)本文主要介紹了浮點(diǎn)數(shù)計(jì)算問(wèn)題,簡(jiǎn)單回答了為什么以及怎么辦兩個(gè)問(wèn)題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個(gè)簡(jiǎn)單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...

    Profeel 評(píng)論0 收藏0
  • javascript中0.1 + 0.2 != 0.3?

    摘要:按照的數(shù)字格式,整數(shù)有的范圍是,而且只能表示有限個(gè)浮點(diǎn)數(shù),能表示的個(gè)數(shù)為個(gè)。 0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問(wèn)一個(gè)高年級(jí)的小學(xué)生,他們都會(huì)毫不猶豫都回答:相等。是的,相等是正常的,這是常識(shí)。但是都說(shuō)實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),拿這道簡(jiǎn)單的算術(shù)題用javascript在chrome控制臺(tái)試驗(yàn)一下: 結(jié)果令人大跌眼鏡,在控制臺(tái)輸入0.1+0.2 == 0.3返回的結(jié)果竟然...

    ivydom 評(píng)論0 收藏0
  • 利用babel(AST)優(yōu)雅地解決0.1+0.2!=0.3問(wèn)題

    摘要:因此利用以及語(yǔ)法樹(shù)在代碼構(gòu)建過(guò)程中重寫(xiě)等符號(hào),開(kāi)發(fā)時(shí)直接以這樣的形式編寫(xiě)代碼,在構(gòu)建過(guò)程中編譯成,從而在開(kāi)發(fā)人員無(wú)感知的情況下解決計(jì)算失精的問(wèn)題,提升代碼的可讀性。 前言 你了解過(guò)0.1+0.2到底等于多少嗎?那0.1+0.7,0.8-0.2呢? 類似于這種問(wèn)題現(xiàn)在已經(jīng)有了很多的解決方案,無(wú)論引入外部庫(kù)或者是自己定義計(jì)算函數(shù)最終的目的都是利用函數(shù)去代替計(jì)算。例如一個(gè)漲跌幅百分比的一個(gè)...

    張巨偉 評(píng)論0 收藏0
  • JS魔法堂:徹底理解0.1 + 0.2 === 0.30000000000000004背后

    摘要:也就是說(shuō)不僅是會(huì)產(chǎn)生這種問(wèn)題,只要是采用的浮點(diǎn)數(shù)編碼方式來(lái)表示浮點(diǎn)數(shù)時(shí),則會(huì)產(chǎn)生這類問(wèn)題。到這里我們都理解只要采取的浮點(diǎn)數(shù)編碼的語(yǔ)言均會(huì)出現(xiàn)上述問(wèn)題,只是它們的標(biāo)準(zhǔn)類庫(kù)已經(jīng)為我們提供了解決方案而已。 Brief 一天有個(gè)朋友問(wèn)我JS中計(jì)算0.7 * 180怎么會(huì)等于125.99999999998,坑也太多了吧!那時(shí)我猜測(cè)是二進(jìn)制表示數(shù)值時(shí)發(fā)生round-off error所導(dǎo)致,但并不...

    JerryWangSAP 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<