試驗准備 分析並實驗 1 小數部分的處理 2 可保存的最大值 3可以保存的最小值 總結
Oracle的NUMBER數據類型表示十進制的數字,分別從整數位個數和小數位個數進行限制。我們以NUMBER(8,2)為例進行分析。
建立一個只有一列的表,NUMBER(8,2)表示數字總個數最多為8,小數部分最多2位(推算出整數部分最多8-2=6位)。
create table t1 (c1 number(8,2));
小數部分代表著精確程度,NUMBER(8,2)可以保存的小數位最多2位,那麼超過2位會怎樣呢?
SQL> insert into t1 values(1.234);
1 row created.
SQL> select * from t1;
C1
----------
1.23
SQL> delete from t1;
1 rows deleted.
SQL> insert into t1 values(1.235);
1 row created.
SQL> select * from t1;
C1
----------
1.24
可見,小數部分對小數點後2位以後的部分采用了四捨五入的算法,1.234存為1.23,而1.235存為1.24。
既然整數部分最多6位,小數部分最多2位,那麼number(8,2)可以表示的最大數字就是999999.99。我們現在插入這個最大的值。
SQL> insert into t1 values(999999.99);
1 row created.
SQL> select * from t1;
C1
----------
999999.99
可見這個數字被正確的存儲了。
下面插入一個更大大數字999999.991。
SQL> insert into t1 values(999999.991);
1 row created.
SQL> select * from t1;
C1
----------
999999.99
可以插入,但是被截斷為999999.99,其實原因很簡單,小數部分的0.991會四捨五入到0.99,捨入後數值成了999999.99,在范圍之內。
再看看999999.995。
SQL> insert into t1 values(999999.995);
insert into t1 values(999999.995)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
插入失敗!原因是999999.995小數部分捨入後變成了1000000.00,超出了6位整數范圍。
負數的范圍與正數范圍對稱,所以最小值為 -999999.99。
NUMBER(8,2)表示的數字范圍為[-999999.99,999999.99]。判斷一個給定數字能否在此范圍之前,先對小數部分進行四捨五入,然後再來比較。判斷步驟:
(1)對第3位小數進行四捨五入,得到帶2位小數的數字; (2)判斷此數字是否在[-999999.99,999999.99]范圍內。