float和double的精度區別

2021-10-14 21:41:48 字數 1429 閱讀 3854

float和double的範圍是由指數的位數來決定的。

float的指數字有8位,而double的指數字有11位,分布如下:

float:

1bit(符號位)

8bits(指數字)

23bits(尾數字)

double:

1bit(符號位)

11bits(指數字)

52bits(尾數字)

value of floating-point = significand x base ^ exponent , with sign — f.1

譯為中文表達即為:

(浮點)數值 = 尾數 × 底數 ^ 指數(附加正負號)---------------- f.2

於是,float的指數範圍為-127 ~ 128,而double的指數範圍為-1023 ~ 1024(double更精確些),並且指數字是按補碼的形式來劃分的。其中負指數決定了浮點數所能表達的絕對值最小的數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。

float的範圍為-2 ^ 128 ~ +2 ^ 128,也即-3.40e + 38 ~ + 3.40e + 38;double的範圍為-2 ^ 1024 ~ + 2 ^ 1024,也即-1.79e + 308 ~ + 1.79e + 308。 (這裡的e表示的是10的多少次方)

float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」,由於它是不變的,故不能對精度造成影響。

float:2^23 =8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字

double:2^52 =4503599627370496,一共16位,同理,double的精度為15~16位

c 語言和c#語言中,對於浮點型別的資料採用單精度型別(float)和雙精度型別(double)來儲存,float資料占用32bit, double資料占用64bit,我們在宣告乙個變數float f= 2.25f的時候,是如何分配記憶體的呢?如果胡亂分配,那世界豈不是亂套了麼,其實不論是float還是double在儲存方式上都是遵從ieee的規範 的,float遵從的是ieee r32.24 ,而double 遵從的是r64.53。

無論是單精度還是雙精度在儲存中都分為三個部分:

符號位(sign) : 0代表正,1代表為負

指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存

尾數部分(mantissa):尾數部分

float和double 精度分析

結論 1.範圍 float和double的範圍是由指數的位數來決定的。float的指數字有8位,而double的指數字有11位,分布如下 float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 於是,floa...

double和float精度問題

遇到問題 後台返回的0.0008客戶端顯示的是科學計數法。解決 把後台返回的資料先轉成bigdecimal型別再保留指定小數 注意 返回的數必須大於0,不大於0時要先判斷,不然保留的小數字數多的話還會科學計數法顯示。當後台返回的是0,我這裡保留了9位小數,還是科學計數法顯示的。bigdecimal ...

Float和Double的範圍和精度

float與d ouble的範圍和精度 float和double的範圍是由指數的位數來決定的。float的指數字有8位,而double的指數字有11位,分布如下 float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits...