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

1 、 number(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.1 number(5,2) 表未小数点右边保留 2 , 小数点左边是 5-2=3
1234
是小数点左边有 4 , 所以报错了 .
 
4.2 number(5,2) 1234.5 来说就是右边保留两位小数,应该就是 1234.50 了,有效位数是 6 ,大于 5 ,所以报错
 
5. 精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
对如果s>p,小数点右边至少有s-p个0填充。我还是没有理解,
例如:number(4,6),是s>p把,但是就是说保留六位小数,不够就会在右边补0,这样总长度就一定会超过4了报错啊?
5.1、declare
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 的输入应为: 12 00 没有超出,所以正常.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值