Oracle数据库中NUMBER(x,y)数据类型详解
Oracle的NUMBER数据类型表⽰⼗进制的数字,分别从整数位个数和⼩数位个数进⾏限制。我们以NUMBER(8,2)为例进⾏分析。
1 试验准备
建⽴⼀个只有⼀列的表,NUMBER(8,2)表⽰数字总个数最多为8,⼩数部分最多2位(推算出整数部分最多8-2=6位)。
create table t1 (c1 number(8,2));
2 分析并实验
2.1 ⼩数部分的处理
⼩数部分代表着精确程度,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。
2.2 可保存的最⼤值
既然整数部分最多6位,⼩数部分最多2位,那么number(8,2)可以表⽰的最⼤数字就是999999.99。我们现在插⼊这个最⼤的值。
SQL> insert into t1 values(999999.99);
1 row created.
SQL> select * from t1;
C1
oracle四舍五入----------
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位整数范围。
2.3可以保存的最⼩值
负数的范围与正数范围对称,所以最⼩值为 -999999.99。
3 总结
NUMBER(8,2)表⽰的数字范围为[-999999.99,999999.99]。判断⼀个给定数字能否在此范围之前,先对⼩数部分进⾏四舍五⼊,然后再来⽐较。判断步骤:
(1)对第3位⼩数进⾏四舍五⼊,得到带2位⼩数的数字;
(2)判断此数字是否在[-999999.99,999999.99]范围内。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。