天天看點

float和double的取值範圍和精度丢失

一. float和double的範圍

在此先補充一個知識點,浮點數的二進制轉換。

長度 符号 指數 尾數 有效位數 指數偏移 說明
單精度 32位 1 8 23 24 127 含有一個隐含位
雙精度 64位 1 11 52 53 1023 含有一個隐含位

以單精度為例:

float和double的取值範圍和精度丢失

S’為符号位,0表示負數,1為正數;E’為階碼,即指數部分,八位可表示256個數值,指數偏移為127(見表格),即指數範圍為-127~+128,計算時實際指數=E’-127;FR’為尾數部分,表示的是科學計數法中小數部分,整數部分預設為1,即計算時實際尾數為1.尾數,例尾數為10101010101010101010101,則計算時1.10101010101010101010101;

浮點數二進制轉換為十進制為:

x = (-1)^s X(1.FR’)X 2^(E-127)

float為單精度浮點型,double為雙精度浮點型,取值範圍主要看指數部分,并且指數位是按補碼的形式來劃分的。其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。float的範圍為-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

二 精度丢失

為什麼int,float同用32位表示,但是float範圍就比int大很多呢? float的精度缺失是什麼原因呢?

因為int數值是連續的,而float數值是跳躍的,并且間隔不一定相等。同用32位表示意思為兩個資料類型可存儲數值的最大數量是相等的,為2的32次方。

舉例:

float和double的取值範圍和精度丢失

由圖可知,兩種類型表示相同數量的數時,float表示的範圍大,但同時有一些數float不能表示,如上圖的2或4等,是以精度缺失,建議慎用float。