0.1 + 0.2 == 0.3 嗎?
為什麼負數要用補碼錶示?
負數之所以用補碼的方式來表示,主要是為了統一和正數的加減法操作一樣,畢竟數字的加減法是很常用的一個操作,就不要搞特殊化,儘量以統一的方式來運算。
十進位制小數怎麼轉成二進位制?
十進位制整數轉二進位制使用的是「除 2 取餘法」,十進位制小數使用的是「乘 2 取整法」。
計算機是怎麼存小數的?
計算機是以浮點數的形式儲存小數的,大多數計算機都是 IEEE 754 標準定義的浮點數格式,包含三個部分:
符號位:表示數字是正數還是負數,為 0 表示正數,為 1 表示負數;
指數位:指定了小數點在資料中的位置,指數可以是負數,也可以是正數,指數位的長度越長則數值的表達範圍就越大;
尾數位:小數點右側的數字,也就是小數部分,比如二進位制 1.0011 x 2^(-2),尾數部分就是 0011,而且尾數的長度決定了這個數的精度,因此如果要表示精度更高的小數,則就要提高尾數位的長度;
用 32 位來表示的浮點數,則稱為單精度浮點數,也就是我們程式語言中的 float 變數,而用 64 位來表示的浮點數,稱為雙精度浮點數,也就是 double 變數。
0.1 + 0.2 == 0.3 嗎?
不是的,0.1 和 0.2 這兩個數字用二進位制表達會是一個一直迴圈的二進位制數,比如 0.1 的二進位制表示為 0.0 0011 0011 0011… (0011 無限迴圈),對於計算機而言,0.1 無法精確表達,這是浮點數計算造成精度損失的根源。
因此,IEEE 754 標準定義的浮點數只能根據精度舍入,然後用「近似值」來表示該二進位制,那麼意味著計算機存放的小數可能不是一個真實值。
0.1 + 0.2 並不等於完整的 0.3,這主要是因為這兩個小數無法用「完整」的二進位制來表示,只能根據精度舍入,所以計算機裡只能採用近似數的方式來儲存,那兩個近似數相加,得到的必然也是一個近似數。
轉載自公眾號
小林coding