Python 數據類型:浮點數


在Python語言中,浮點數是有精度的,通常有精度缺失,這是由於浮點數是使用2進制進行計算的,如下所示:

>>> print(0.3 - 0.2)
>>> print(0.3 - 0.2 == 0.1)

0.09999999999999998
False

讓我們考慮十進制的 1 / 3 是 0.3333333,十進制的 2 / 3 是 0.6666666,如果兩者相加只會得到 0.9999999,它不等於 1。同樣,0.3、0.2 也不能用二進制准確表示您使用了多少有效數字。 分母為 5 和 2 倍數的分數只能用十進制精確表示,同樣分母為 2 倍數的分數只能用二進制精確表示。 浮點數使用 IEEE 標准 754 在內部存儲,該標准僅在 15-17 位有效數字范圍內是正確的。

我們可以使用內置的decimal (十進制) 模塊來改變精度並獲得准確的結果。 getcontext().prec 可用於設置每個十進制值的精度。 默認精度為 28 位。

為什么 0.1 + 0.2 = 0.30000000000000004?

在開始回答之前,讓我們先了解一個小概念:出於計算目的,數字是如何表示的? 非常小的和非常大的數字通常以科學記數法存儲,表示為:

當一個數字以科學計數法表示時,小數點前有一個非零十進制數據,該數字被標准化。例如,以科學記數法表示數字 0.0005606 :

該表示法有一個顯著的特點是:前面的數字是不為0的個位數,基數是10,指數表示小數點向前(-4,負整數)或向后(正整數)移動的位數。

在計算機編程語言中,浮點數運算通常有兩種表示數字的方法:單精度和雙精度。 單精度使用 32 位,雙精度使用 64 位進行浮點運算。與許多其他編程語言不同,JavaScript 沒有定義不同類型的數字數據類型,並且始終按照國際 IEEE 754 標准將數字存儲為雙精度浮點數。IEEE 754標准格式以64位來存儲浮點數,其中小數存儲在第0-51位,值數存儲在第52-62位,符號存儲在第63位。

按照IEEE 754的標准,以64位來表示0.1, 

第一步是將 (0.1) 基數 10 轉換為其二進制等效值(基數 2)。
為此,我們將從 0.1 乘以 2 開始,並將小數點前的數字分開以獲得二進制等價物。

在對 64 位重復此操作時,我們將按升序排列它們以獲得我們的尾數,我們將根據雙精度標准將其四舍五入為 52 位。

以科學形式表示並四舍五入到前 52 位將產生:

對於指數,我們需要使用以下公式來計算:

11表示用於指數的64位表示法的位數,-4表示科學計數法中的指數。

最終0.1按照IEEE 754的二進制表示是:

相似的,0.2按照IEEE 754的二進制表示是:

 

把這兩個數字加和得到:

最后,0.1+0.2 的結果用二進制表示是: 

 這就是為啥0.1+0.2=0.30000000000000004的理由。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM