一、关于number本身
declare
i number(5,2);--整数位=3,小数位=2,总位数=5
begin
i := 205.3456;
dbms_output.put_line(i);--打印205.35
end;
结论:
1、 当数字i的小数位超出nmber规定的2时,系统不会报错,对i的处理是根据小数位四舍五入。
declare
i number(5,2);
begin
i := 2051.3456;
dbms_output.put_line(i);--系统报错
end;
结论:
2、 当数字i的整数位超出限制的3位时,系统会报错。
3、 整数位一定要满足number限制,小数位可以不满足number限制,但是会四舍五入处理。
declare
i number(5);
begin
i := 205.5456;
dbms_output.put_line(i);--打印206
end;
结论:
4、 如果number只写了整数位,那么i有小数位的话也不会报错,要从当前小数点四舍五入。
declare
i number(5,2);
begin
i := 205;
dbms_output.put_line(i);--打印205,而非205.00
end;
declare
i number(5,2);
begin
i := 205.6;
dbms_output.put_line(i);--打印205.6,而非205.60
end;
结论:
5、 如果变量i规定了小数位,但是实际赋的值没有小数位或者小数位少于规定的,不会出错,最后得到的值就是实际的值。
6、 如果在数据库中number字段规定了小数位,那么存储进去的值少于小数位会自动补0。
二、trunc与 round比较
trunc (89.985,2) = 89.98—小数点后2位开始
trunc (89.985) = 89—当前小数点开始,取整
trunc (89.985,-1) = 80—小数点前1位开始,截完补0
trunc (84.985,-1) = 80
trunc (405.635,-3) = 0
trunc (505.635,-3) = 0
--trunc直接截除
round(89.985,2) = 89.99—小数点后2位开始,四舍五入
round(89.985) = 90—当前小数点开始,四舍五入
round(89.985,-1) = 90—小数点前1位开始,四舍五入,然后补0
round(84.985,-1) = 80
round(405.635,-3) = 0
round(505.635,-3) = 1000
--round要对小数点后面的数字判断,然后四舍五入
三、ceil和floor比较(取整,不涉及到四舍五入的问题)
1)正数示例
ceil(2.3355) = 3 --取整(大)
trunc(2.3355) = 2 --取整(直接截)
floor(2.3355) = 2 —取整(小)
2)负数示例
ceil(-2.3355) = -2 --取整(大)
trunc(-2.3355) = -2 --取整(直接截)
floor(-2.3355) = -3 —取整(小)
四、绝对值abs
abs(-2.3355) = 2.3355
abs(2.3355) = 2.3355
例子:结果应该是205.53,205.52才对啊!为什么是205.53,205.53了呢?
declare
i number(5,2);
v_trunc number(5,2);
begin
i := 205.525888888;--这里实际的i=205.53,因为number限制了。
select trunc(i,2) into v_trunc from dual;--所以这里trunc函数中的i=205.53
dbms_output.put_line(i);
dbms_output.put_line(v_trunc);
end;