我有基于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);
}
}
答案 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);
}
}