【原创】oracle下decimal和number…

       Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中(如DB2等)。

        因为decimal在Oracle底层就是number类型,所以就当两者基本上可以互换。但是两者之间仍有一些区别:

请看下例:

--测试number的函数

create or replace function test_number return number
is
results number(8,2);
begin
results := 1234.65;
return results;
end;
/

--测试decimal的函数

create or replace function test_decimal return decimal
is
Results decimal(8,2);
begin
Results := 1234.65;
return Results;
end;
/

select test_decimal(),test_number from dual;

--测试结果

TEST_DECIMAL()      TEST_NUMBER
--------------               -----------
          1235              1234.65

定义变量时,decimal和nmber都指定了相同的格式。但是在返回值上,decimal仅仅是取整(四舍五入了)。

--测试decimal

create or replace function test_decimal return decimal
is
Results   decimal(8,2);
re           number(8,2);
begin
Results := 1234.65;

re := Results;
return re;
end;
/

这个测试函数里定义了一个number的变量re,将decimal类型Results的值赋给re ,但是返回值仍然是1234。

而我用dbms_output.put_line(Results);结果是1234.65。

一点猜测:

这说明最初对Results的赋值是成功的,只是后来使用decimal时,自动将小数后面的都四舍五入了,换成了整数。

这样自然就会导致精度的丢失。所以使用时,建议使用numbe类型。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值