博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE NUMBER类型Scale为0引发的问题
阅读量:5926 次
发布时间:2019-06-19

本文共 1273 字,大约阅读时间需要 4 分钟。

今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例。假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据

CREATE TABLE TEST
(
     Category VARCHAR(12),
     QTY  NUMBER
)
 
INSERT INTO TEST
SELECT 'M', 12 FROM DUAL UNION ALL
SELECT 'C', 0.99999999999999999 FROM DUAL;
 
COMMIT;

此时直接查询表TEST,发现QTY字段值为1,

使用下面SQL语句统计时,SUM_QTY的值也是1

但是如果在游标里面获取该值的时候,你会发现字段QTY的值为原来的值.99999999999999999

DECLARE  CURSOR c_test
IS
   SELECT Category, SUM(QTY) AS SUM_QTY FROM TEST
   GROUP BY Category;
  
   c_row c_test%rowtype;
  
 begin 
       for c_row in c_test loop
           dbms_output.put_line('the result is ' || c_row.SUM_QTY);
       end loop;
 end;

the result is .99999999999999999

the result is 12

为什么会有这个奇怪的现象呢? 其实我们遇到这个案例时是按这个顺序反着的,最后发现是插入的值是0.999999999. 当然这个过程是非常纠结的。远非我们例子里面那样轻松简单。要解释这个问题,要从NUMBER类型说起,NUMBER (p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127。 Number(p) 表示声明一个整数相当于Number(p, 0), 如果不指定p和s,NUMBER类型,它的默认精度值为38, 默认的scale值为0. 所以出现在SELECT语句中,一个值为.99999999999999999 的显示为1,但是在游标中,它获取的是这个字段的真实值,没有经过转化。所以出现了这个稀奇古怪的问题。虽然事后理顺过后觉得非常简单,但是当时不了解情 况下,觉得非常不可思议,非常纳闷!

 

另外附上定点数的精度(p)和刻度(s)遵循以下规则:

 当一个数的整数部分的长度 > p-s 时,Oracle就会报错
 当一个数的小数部分的长度 > s 时,Oracle就会舍入。
 当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
 当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入

转载地址:http://cqovx.baihongyu.com/

你可能感兴趣的文章
android 开源组件合集-UI篇(2013-11-07更新)
查看>>
[转]Multiple outputs from T4 made easy
查看>>
hdu 4597 + uva 10891(一类区间dp)
查看>>
js获取当前页面url网址等信息
查看>>
软件方面的词汇
查看>>
[禅悟人生]尊严非席, 不可卷起
查看>>
HelloSilverlight
查看>>
在phpmyadmin后台获取webshell方法汇总整理
查看>>
UpdatePanel的用法
查看>>
开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
查看>>
四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x
查看>>
深入浅出Docker(三):Docker开源之路
查看>>
同一个PC只能运行一个应用实例(考虑多个用户会话情况)
查看>>
js深拷贝和浅拷贝
查看>>
WPF:在ControlTemplate中使用TemplateBinding
查看>>
loadrunner 参数化数据更新方式
查看>>
AngularJS快速入门指南09:SQL
查看>>
oncontextmenu事件
查看>>
从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)
查看>>
【转】Ubuntu 修改hosts
查看>>