【轉】oracle的number類型精度、刻度范圍


一、 oracle number 類型精度、刻度范圍
number(p,s)
p: 1---38
s: -84---127
有效數位 :從左邊第一個不為 0 的數算起,到末位數字為止的所有數字,小數點和負號不計入有效位數。
p>0 ,對 s 分 3 種情況:
1. s>0
精確到小數點右邊 s 位,並四舍五入 。然后檢驗有效數位是否 <= p
ZWF.YUDONG>create table t_n(id number(5,2));
Table created.
-- 小數點前面最多只能有 3 位,小數點后面位數可以任意多
ZWF.YUDONG>insert into t_n values(123.45);
1 row created.
ZWF.YUDONG>insert into t_n values(123.455);
1 row created.

ZWF.YUDONG>insert into t_n values(12.345);
1 row created.
ZWF.YUDONG>insert into t_n values(1.234);
1 row created.
ZWF.YUDONG>insert into t_n values(.001);
1 row created.
ZWF.YUDONG>select * from t_n;
       ID
----------
123.45
123.46

12.35

1.23

0.00
5 rows selected.
ZWF.YUDONG>insert into t_n values(1234.5678); -- 有效位為 4 + 2 > 5
insert into t_n values(1234.5678)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

ZWF.YUDONG>insert into t_n values(12345); -- 有效位為 5 + 2 > 5
insert into t_n values(12345)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

如果 s > p ,小數點右邊至少有 s - p 0 填充
ZWF.YUDONG>create table t_n(id number(4,5));
Table created.
ZWF.YUDONG>insert into t_n values(1);
insert into t_n values(1)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
ZWF.YUDONG>insert into t_n values(.1); -- 0.10000 ,有效位為 5 > 4
insert into t_n values(.1)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
ZWF.YUDONG>insert into t_n values(1.01 ); -- 1.01000 ,有效位為 6 > 4
insert into t_n values(1.01)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
ZWF.YUDONG>insert into t_n values(.01);
1 row created.
ZWF.YUDONG>insert into t_n values(.001);
1 row created.
ZWF.YUDONG>insert into t_n values(.0001);
1 row created.
ZWF.YUDONG>insert into t_n values(.00001);
1 row created.
ZWF.YUDONG>insert into t_n values(.00000 6);
1 row created.
ZWF.YUDONG>insert into t_n values(.000000 1); -- 超過刻度存儲 0
1 row created.
ZWF.YUDONG>select * from t_n;
       ID
-------------
   0.01000
   0.00100

0.00010
0.00001
0.00001
0.00000
6 rows selected.

2. s<0
精確到小數點左邊 s 位,並四舍五入 。然后檢驗有效數位是否 <= p + |s|

ZWF.YUDONG>create table t_n(id number(5,-2));
Table created.
ZWF.YUDONG>insert into t_n values(123);
1 row created.
ZWF.YUDONG>insert into t_n values(1234);
1 row created.
ZWF.YUDONG>insert into t_n values(12345);
1 row created.
ZWF.YUDONG>insert into t_n values(123456);
1 row created.
ZWF.YUDONG>insert into t_n values(1234567);
1 row created.
ZWF.YUDONG>insert into t_n values(12 );
1 row created.
ZWF.YUDONG>insert into t_n values(1 );
1 row created.
ZWF.YUDONG>insert into t_n values(.1 );
1 row created.
ZWF.YUDONG>insert into t_n values(1234567.6789 );
1 row created.
ZWF.YUDONG>select * from t_n;
       ID
------------
100
1200
12300
123500
1234600
0
0
0
1234600
9 rows selected.
ZWF.YUDONG>insert into t_n values(12345678);
insert into t_n values(12345678)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
3. s=0 表示整數
number(p) : 相當於 number(p,0) ,用於指定整數
number :不指定 p 、 s 的 number ,用於表示浮點數,其 precision 和 scale 都是 oracle 所能支持的最大值
總結:

p < s 這種情況下

1. 只能用來存放大於 0 小於 1 小數 。
2. 小數點后緊接着的 0 的數目至少有 s-p 個 ,不然無法正常插入。
3. p 用來指定小數點之后的最大有效數字位數。當然不包括小數點后緊接着的 0 的個數。
4. s 是用來限制小數點后的數字位數【當然也就包括小數點后緊接的 0 】。
p > s 這種情況下

小數點前最多能插入: p - s 個數字,但是小數點后的數字可以任意長度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM