ORACLE_NUMBER类型Scale为0引发的问题
2017-05-18 12:11
316 查看
摘要: 今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例。假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATE TABLE TEST ( Category VARCHAR(12), QTY NUM
今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例。假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据
此时直接查询表TEST,发现QTY字段值为1,
![](http://images.cnitblog.com/blog/73542/201504/142355081511260.png)
使用下面SQL语句统计时,SUM_QTY的值也是1
![](http://images.cnitblog.com/blog/73542/201504/142355111825499.png)
但是如果在游标里面获取该值的时候,你会发现字段QTY的值为原来的值.99999999999999999
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位向右的数字被舍
点击打开链接
今天遇到了一个很有意思的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,
![](http://images.cnitblog.com/blog/73542/201504/142355081511260.png)
使用下面SQL语句统计时,SUM_QTY的值也是1
![](http://images.cnitblog.com/blog/73542/201504/142355111825499.png)
但是如果在游标里面获取该值的时候,你会发现字段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位向右的数字被舍
点击打开链接
相关文章推荐
- ORACLE_NUMBER类型Scale为0引发的问题
- ORACLE 中NUMBER类型默认的精度和Scale问题
- 【NUMBER】有关Oracle NUMBER类型定义中precision和scale的测试和总结
- Oracle中NUMBER类型问题
- Oracle用 odp.net 时出现 Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常 问题的解决
- 一个关于Oracle更新语句引发的时间字段类型的问题
- 在Oracle中NUMBER数据类型的定义问题
- Oracle 关于number类型转换to_char类型 存在的问题
- Oracle中Number类型字段使用.netTiers和CodeSmith问题的解决方案
- Oracle Number类型超长小数位为0问题
- 查看oracle的number(20)类型数据为科学计数法的问题
- 转载《Oracle中NUMBER类型问题 》
- Oracle中NUMBER类型问题
- oracle中number数据类型的存储以及最大值问题
- ORACLE NUMBER类型Scale为0引发的问题
- 解决从pl/sql查看oracle的number(19)类型数据为科学计数法的有关问题
- to_number与oracle 里面number类型易出错的问题
- Oracle中Number类型字段使用.netTiers和CodeSmith问题的解决方案
- Oracle中NUMBER类型问题
- 解决从pl/sql查看oracle的number(19)类型数据为科学计数法的问题