float double位數(精度)解析
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) {38個9後邊帶88個0} 的數字,當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