float和double的範圍和精度,Oracle的Number類型

來源:互聯網
上載者:User

標籤:

double、float都是浮點型。double(雙精確度型)比float(單精確度型)存的資料更準確些,占的空間也更大。double精度是float的兩倍,所以需要更精確的計算常使用double。

單精確度浮點數在機內佔4個位元組,用32位二進位描述。
雙精確度浮點數在機內佔8個位元組,用64位二進位描述。

浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。
數符佔1位二進位,表示數的正負。
指數符佔1位二進位,表示指數的正負。
尾數表示浮點數有效數字,0.xxxxxxx,但不存開頭的0和點
指數存指數的有效數字。

指數佔多少位,尾數佔多少位,由電腦系統決定。
可能是數符加尾數佔24位,指數符加指數佔8位 -- float.
數符加尾數佔48位,指數符加指數佔16位 -- double.

知道了這四部分的佔位,按二進位估計大小範圍,再換算為十進位,就是你想知道的數值範圍。

對編程人員來說,double 和 float 的區別是double精度高,有效數字16位,float精度7位。但double消耗記憶體是float的兩倍,double的運算速度比float慢得多,C語言中數學函數名稱double 和 float不同,不要寫錯,能用單精確度時不要用雙精確度(以省記憶體,加快運算速度)。  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

float和double的範圍和精度,Oracle的Number類型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.