不管是什麼數, 在計算機中最終都會被轉化為 0 和 1 進行儲存, 所以需要弄明白以下幾點問題
首先我們要了解浮點數二進位制表示, 有以下兩個原則:
我們繼續按照浮點數的二進位制表示來計算0.1 * 2 = 0.2 整數部分取 00.2 * 2 = 0.4 整數部分取 00.4 * 2 = 0.8 整數部分取 00.8 * 2 = 1.6 整數部分取 10.6 * 2 = 1.2 整數部分取 10.2 * 2 = 0.4 整數部分取 0…
所以你會發現, 0.1 的二進位制表示是 0.00011001100110011001100110011……00110011 作為二進位制小數的迴圈節不斷的進行迴圈.
這就引出了一個問題, 你永遠不能存下 0.1 的二進位制, 即使你把全世界的硬碟都放在一起, 也存不下 0.1 的二進位制小數.
Python 和 C 一樣, 採用 IEEE 754 規範來儲存浮點數. IEEE 754 對雙精度浮點數的儲存規範將 64 bit 分為 3 部分.
而且可以指出的是, double 能儲存的數的個數是有限的, double 能代表的數必然不超過 2^64 個, 那麼現實世界上有多少個小數呢? 無限個. 計算機能做的只能是一個接近這個小數的值, 是這個值在一定精度下與邏輯認為的值相等. 換句話說, 每個小數的儲存(但是不是所有的), 都會伴有精度的丟失.
現在我們可以回顧你提出的問題
0.1 在計算機儲存中真正的數字是 0.10000000000000000555111512312578270211815834045410156250.2 是
0.2000000000000000111022302462515654042363166809082031250.3 是
0.299999999999999988897769753748434595763683319091796875
這就是為什麼 0.1 + 0.2 != 0.3 的原因
至於 1.1 + 2.2 與之類似。
不管是什麼數, 在計算機中最終都會被轉化為 0 和 1 進行儲存, 所以需要弄明白以下幾點問題
一個小數如何轉化為二進位制浮點數的二進位制如何儲存浮點數的二進位制表示首先我們要了解浮點數二進位制表示, 有以下兩個原則:
整數部分對 2 取餘然後逆序排列小數部分乘 2 取整數部分, 然後順序排列0.1 的表示是什麼?我們繼續按照浮點數的二進位制表示來計算0.1 * 2 = 0.2 整數部分取 00.2 * 2 = 0.4 整數部分取 00.4 * 2 = 0.8 整數部分取 00.8 * 2 = 1.6 整數部分取 10.6 * 2 = 1.2 整數部分取 10.2 * 2 = 0.4 整數部分取 0…
所以你會發現, 0.1 的二進位制表示是 0.00011001100110011001100110011……00110011 作為二進位制小數的迴圈節不斷的進行迴圈.
這就引出了一個問題, 你永遠不能存下 0.1 的二進位制, 即使你把全世界的硬碟都放在一起, 也存不下 0.1 的二進位制小數.
浮點數的二進位制儲存Python 和 C 一樣, 採用 IEEE 754 規範來儲存浮點數. IEEE 754 對雙精度浮點數的儲存規範將 64 bit 分為 3 部分.
第 1 bit 位用來儲存 符號, 決定這個數是正數還是負數然後使用 11 bit 來儲存指數部分剩下的 52 bit 用來儲存尾數Double-precision_floating-point_format而且可以指出的是, double 能儲存的數的個數是有限的, double 能代表的數必然不超過 2^64 個, 那麼現實世界上有多少個小數呢? 無限個. 計算機能做的只能是一個接近這個小數的值, 是這個值在一定精度下與邏輯認為的值相等. 換句話說, 每個小數的儲存(但是不是所有的), 都會伴有精度的丟失.
浮點數計算的問題現在我們可以回顧你提出的問題
0.1 + 0.2 == 0.30.1 在計算機儲存中真正的數字是 0.10000000000000000555111512312578270211815834045410156250.2 是
0.2000000000000000111022302462515654042363166809082031250.3 是
0.299999999999999988897769753748434595763683319091796875
這就是為什麼 0.1 + 0.2 != 0.3 的原因
至於 1.1 + 2.2 與之類似。