Oracle ojdbc驱动程序在NUMBER类型列中返回整数值的float结果

时间:2015-07-25 01:21:31

标签: java sql oracle

我有基于Spring 4.1.6框架的Oracle 10g数据库和Java应用程序,它从Oracle中提取一些数据。我遇到了一个问题,ojdbc驱动程序返回float类型列中整数值的NUMBER结果。 ResultSet元数据将对象类型标识为BigDecimal。

列定义: MINUTES NUMBER没有精确度和规模 实际值为“70”

我已经检查了Oracle 10,11和12个ojdbc驱动程序,并且每次都与此列的值Java code returns "70.0000000000000000000000000000000000002相同。我还检查了Oracle SQL Developer 4.1.1,它显示了相同的错误浮点值。

然而,Toad显示正确的值“70”。

有什么想法吗?请再次注意:**此问题在Oracle SQL Developer 4.1.1 **

中重现

更新 - 下面的Java代码:

for (int j = 1; j <= count; j++) {
 Object field = resultSet.getObject(j);
 if (field != null) { 
      bufferedWriter.write(field.toString());
 }
 if (j < count) { 
       bufferedWriter.write(delimiter); 
 } 
}

1 个答案:

答案 0 :(得分:1)

NUMBER数据类型存储固定和浮点数。指定数字字段时,最好指定精度和比例。这为输入提供了额外的完整性检查。

NUMBER(精度,比例)

但是,如果未指定精度,则列将值存储为给定,即最大比例和最大精度(最多38位精度)。如上所述,它在java中的行为为Float。下面给出的样本输入示例:

Input              Stored As
7,456,123.89       7456123.89

Oracle Data Type的更多信息。

特别是本节:

  

内部数字格式

     

Oracle数据库以可变长度格式存储数字数据。每个值都以科学计数法存储,1个字节用于存储指数,最多20个字节用于存储尾数。结果值限制为38位精度。 Oracle数据库不存储前导零和尾随零。例如,数字412以类似于4.12×102的格式存储,其中1个字节用于存储指数(2),2个字节用于存储尾数(4,1,2)的三个有效数字。负数包括其长度的符号。

因此,如果您只想存储Integer值,请将列定义更改为NUMBER(10,0),这与您在java中的Integer一样接近。否则,从BigDecimal

中删除尾随零

编辑代码:

for (int j = 1; j <= count; j++) {
 BigDecimal field = (BigDecimal)resultSet.getObject(j);
 if (field != null) { 
    bufferedWriter.write(field.stripTrailingZeros().toString());
 }
 if (j < count) { 
     bufferedWriter.write(delimiter); 
 } 
}

或明确地转换为整数(丢失小数部分)

for (int j = 1; j <= count; j++) {
     Integer field = (Integer)resultSet.getObject(j);
     if (field != null) { 
         bufferedWriter.write(field.toString());
     }
     if (j < count) { 
         bufferedWriter.write(delimiter); 
     } 
    }