Number(p,s)的认识....

1number(p,s)
整数位<=p-s,精确到小数点后s位,并四舍五入。
s为负数,则精确到小数点前s位,并四舍五入。
 
2、如果p=0,比如 number(10) 此时插入数值0.5,小数点后一位四舍五入,实际存储值为1,请大家注意
 
3.这里p是精度, s是刻毒范围
精度是数值中所有数字位的个数, 而刻度范围是小数点右边的数字的个数
 
 
4、Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as wzhu
 
SQL> create table tb_test(id number(5,2));
Table created
 
SQL> insert into tb_test values(234.45);
1 row inserted
 
SQL> insert into tb_test values(1234.5);
insert into tb_test values(1234.5)
ORA-01438: value larger than specified precision allows for this column
/*ERROR 位于第 1 :
ORA-01438:
值大于此列指定的允许精确度 */
 
4.1number(5,2) 表未小数点右边保留 2 , 小数点左边是 5-2=3
1234
是小数点左边有4, 所以报错了.
 
4.2number(5,2)1234.5来说就是右边保留两位小数,应该就是1234.50了,有效位数是6,大于5,所以报错
 
5. 精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p0填充。
对如果s>p,小数点右边至少有s-p0填充。我还是没有理解,
例如:number(4,6),是s>p把,但是就是说保留六位小数,不够就会在右边补0,这样总长度就一定会超过4了报错啊?
5.1declare
v_number number(4,7);
begin
v_number :=123.45;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
这是我的测试代码,都是报错
ORA-06502: PL/SQL: numeric or value error: number precision too large
5.2、declare
v_number number(4,2);
begin
v_number:=123;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
Output: ORA-06502: PL/SQL: numeric or value error: number precision too large
5.3 declare
v_number number(4,2);
begin
v_number:=12;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
 
output: 12
 
由5.2 和 5.3 比较可以看出,number(p,s) 的结构是这样,P 为number 的总位数,S包含于P,属于小数点后面精确位数,即5.2 的输出形式为: 123.00 ,一共为 5位,超出了所定义的决位数number(4,2) 中的4,故报错; 5.3 的输入应为:1200 没有超出,所以正常.

posted on 2006-04-12 14:04  封起De日子  阅读(412)  评论(0编辑  收藏  举报

导航