orcale数字截取处理

一、关于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;

posted @ 2009-11-17 13:36  TOYOE  阅读(521)  评论(0编辑  收藏  举报