ORACLE NUMBER类型Scale为0引发的问题
2015-04-14 23:55
281 查看
今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例。假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据
此时直接查询表TEST,发现QTY字段值为1,
使用下面SQL语句统计时,SUM_QTY的值也是1
但是如果在游标里面获取该值的时候,你会发现字段QTY的值为原来的值.99999999999999999
theresultis.99999999999999999
theresultis12
为什么会有这个奇怪的现象呢?其实我们遇到这个案例时是按这个顺序反着的,最后发现是插入的值是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位向右的数字被舍入
CREATETABLETEST
(
CategoryVARCHAR(12),
QTYNUMBER
)
INSERTINTOTEST
SELECT'M',12FROMDUALUNIONALL
SELECT'C',0.99999999999999999FROMDUAL;
COMMIT;
此时直接查询表TEST,发现QTY字段值为1,
使用下面SQL语句统计时,SUM_QTY的值也是1
但是如果在游标里面获取该值的时候,你会发现字段QTY的值为原来的值.99999999999999999
DECLARECURSORc_test
IS
SELECTCategory,SUM(QTY)ASSUM_QTYFROMTEST
GROUPBYCategory;
c_rowc_test%rowtype;
begin
forc_rowinc_testloop
dbms_output.put_line('theresultis'||c_row.SUM_QTY);
endloop;
end;
theresultis.99999999999999999
theresultis12
为什么会有这个奇怪的现象呢?其实我们遇到这个案例时是按这个顺序反着的,最后发现是插入的值是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位向右的数字被舍入
相关文章推荐
- ORACLE_NUMBER类型Scale为0引发的问题
- ORACLE_NUMBER类型Scale为0引发的问题
- Velocity Toolbox类的方法无法调用时引发的一个类型转换问题
- Java int基本类型和Integer之间引发的问题思考
- SQLServer2008中datetime类型不加引号所引发的问题
- AS3 URLRequest相关,浏览器请求头MIME类型引发的问题
- 学点 C 语言(17): 数据类型 - 因类型引发的问题或错误
- AddOutParameter引发类型问题
- SAE Python urllib2因请求头字典键名为Unicode类型引发的异常问题
- sqlserver中int 类型的字段,值为null的时候引发一个问题
- C#+Emgucv:解决"Emgu.CV.CvInvoke”的类型初始值设定项引发异常"的问题
- JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
- SQLServer2008中datetime类型不加引号所引发的问题
- 解决VS2012 WPF中“对类型“ ”的构造函数执行符合制定的绑定约束的调用时引发了异常。行号为“3”,行位置为“9””问题的过程
- 关于修改以太网帧头类型字段引发的问题
- 解决VS2005提示类型初始值设定引发异常或配置系统未能初始化问题
- mybatis date类型引发问题
- 一个关于Oracle更新语句引发的时间字段类型的问题
- 字段类型设计与实际业务不符引发的问题1
- 字段类型设计与实际业务不符引发的问题2