国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

0.1 + 0.2 != 0.3背后的原理

阿羅 / 526人閱讀

摘要:標準是浮點數算術標準的標準編號,等同于國際標準。標準規定了計算機程序設計環境中的二進制和十進制的浮點數之間的交換算術格式以及方法。

初學JavaScript,在進行小數(浮點數)運算時,經常會碰到這樣的情況:0.1 + 0.2=0.30000000000000004,記得當時,教程告訴我們說,0.1 + 0.2在JavaScript運算中,它的值是不固定的,可以在后面學習和試驗中,漸漸發現,這個值似乎每次都是0.30000000000000004,于是漸漸懷疑當時學習過程中關于它的和值是不固定的說法。

其實有一定編程基礎的同學們應該都知道,計算機是采用二進制來表示十進制的,規則是:整數除以2,商繼續除以2,得到0為止,將余數逆序排列;小數乘以2,取整,小數部分繼續乘以2,取整,得到小數部分0為止,將整數順序排列。例如:

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

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

IEEE 754 標準是IEEE浮點數算術標準(IEEE Standard for Floating-Point Arithmetic)的標準編號 ,等同于國際標準ISO/IEC/IEEE 60559 。IEEE 754 標準規定了計算機程序設計環境中的二進制和十進制的浮點數之間的交換、算術格式以及方法 。

根據前面介紹的知識,0.1 的二進制表示為:

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

0.2 的二進制表示為:

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

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

所以說,0.1 + 0.2=0.30000000000000004,在JavaScript中,它的結果并非不固定的。

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95315.html

相關文章

  • 為什么0.1+0.2不等于0.3

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

    Profeel 評論0 收藏0
  • javascript中0.1 + 0.2 != 0.3?

    摘要:按照的數字格式,整數有的范圍是,而且只能表示有限個浮點數,能表示的個數為個。 0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問一個高年級的小學生,他們都會毫不猶豫都回答:相等。是的,相等是正常的,這是常識。但是都說實踐是檢驗真理的唯一標準,拿這道簡單的算術題用javascript在chrome控制臺試驗一下: 結果令人大跌眼鏡,在控制臺輸入0.1+0.2 == 0.3返回的結果竟然...

    ivydom 評論0 收藏0
  • 利用babel(AST)優雅地解決0.1+0.2!=0.3問題

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

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

    摘要:也就是說不僅是會產生這種問題,只要是采用的浮點數編碼方式來表示浮點數時,則會產生這類問題。到這里我們都理解只要采取的浮點數編碼的語言均會出現上述問題,只是它們的標準類庫已經為我們提供了解決方案而已。 Brief 一天有個朋友問我JS中計算0.7 * 180怎么會等于125.99999999998,坑也太多了吧!那時我猜測是二進制表示數值時發生round-off error所導致,但并不...

    JerryWangSAP 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<