float double精度和範圍

2021-06-22 05:20:04 字數 2598 閱讀 6357

1. 範圍

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

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

float:

1bit(符號位) 8bits(指數字) 23bits(尾數字)

double:

1bit(符號位) 11bits(指數字) 52bits(尾數字)

於是,float的指數範圍為-127~+128,而double的指數範圍為-1023~+1024,並且指數字是按補碼的形式來劃分的。

其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。

float的範圍為-2^128 ~ +2^128,也即-3.40e+38 ~ +3.40e+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79e+308 ~ +1.79e+308。

2.  精度

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

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

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

3.oracle中number型別

在oracle中number型別可以用來儲存0,正負定點或者浮點數,可表示的資料範圍在

1.0 * 10(-130) —— 9.9...9 * 10(125)

的數字,當oracle中的數學表示式的值》=1.0*10(126)時,oracle就會報錯。

number的資料宣告如下:

表示        作用        說明

number(p, s)        宣告乙個定點數        p(precision)為精度,s(scale)表示小數點右邊的數字個數,精度最大值為38,

number(p)        宣告乙個整數        相當於number(p, 0)

number        宣告乙個浮點數        其精度為38,要注意的是scale的值沒有應用,也就是說scale的指不能簡單的理解為0,或者其他的數。

定點數的精度(p)和刻度(s)遵循以下規則:

?        當乙個數的整數部分的長度 > p-s 時,oracle就會報錯

?        當乙個數的小數部分的長度 > s 時,oracle就會捨入。

?        當s(scale)為負數時,oracle就對小數點左邊的s個數字進行捨入。

?        當s > p 時, p表示小數點後第s位向左最多可以有多少位數字,如果大於p則oracle報錯,小數點後s位向右的數字被捨入

4.驗證

create or replace function  func_test(p_type number) return number

is/*

功能:基於警度圖資料同步

*/l_cnt number;

begin

select p_type into l_cnt from dual;

return l_cnt;

end func_test;

/show err;

5.結論

number 的總長度是40位,其中可能包括:小數點,負號位。

select to_char(func_test(-987.1234567891234567891234567891234567891234)) from dual;

-987.12345678912345678912345678912345679   //包括小數點及負號位共40位

select to_char(func_test(9876.1234567891234567891234567891234567891234)) from dual;

9876.12345678912345678912345678912345679   //4位整數+小數點+35位小數=40位

select to_char(func_test(987.1234567891234567891234567891234567891234)) from dual;

987.123456789123456789123456789123456789   //3位整數+小數點+36位小數=40位

select to_char(func_test(1234567891234567891234567891234567891234)) from dual;

1234567891234567891234567891234567891234   //40位整數

select to_char(func_test(12345678912345678912345678912345678912345)) from dual;

1.2345678912345678912345678912345679e+40   //41位時精度發生丟失

1.2345678912345678912345678912345679×10^40 即 12345678912345678912345678912345678900000

float,double範圍和精度

今天遇到一題zoj 1128,資料範圍是 0 x1下面引用 1.範圍 float和double的範圍是由指數的位數來決定的。float的指數字有8位,而double的指數字有11位,分布如下 float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11...

float double 精度問題

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

float double精度丟失

本文參考略加補充。都知道十進位制整數轉換二進位制 2 十進位制小數轉換二進位制 2 取 整 但小數有時乘不盡。結論 1 整數永遠可以用二進位制精確表示 2 小數的二進位制表示有時是不可能精確的 正如十進位制不法表示1 3,二進位制也無法表示1 10 這也就解釋了為什麼浮點型減法出現了 減不盡 的精度...