在 Oracle 数据库中,当字段类型为 NUMBER(5,2) 且存储的值为 0.1 时,Java 程序查询结果可能显示为 ".1"(省略前导零),这是由 Oracle JDBC 驱动默认的数字格式化行为 导致的。以下是原因分析和解决方案:
原因分析
-  
Oracle 的
NUMBER类型特性NUMBER(5,2)表示最多 5 位数字,其中 2 位是小数(范围:-999.99到999.99)。- 当存储 
0.1时,实际存储的是精确值0.10(补全小数位到 2 位),但查询时会省略末尾的零。 
 -  
JDBC 驱动的默认格式化
- Oracle JDBC 驱动(如 
ojdbc8)在返回NUMBER类型时,默认会去除前导零(如0.1→".1"),这是为了减少不必要的字符。 
 - Oracle JDBC 驱动(如 
 -  
Java 数据类型映射
NUMBER字段会被 JDBC 驱动映射为BigDecimal或Double,而BigDecimal.toString()默认会省略前导零。
 
解决方案
方法1:在 SQL 查询中显式格式化
使用 TO_CHAR 函数强制保留前导零:
SELECT TO_CHAR(your_number_column, '0.00') FROM your_table;
 
结果会固定为 "0.10"(字符串类型)。
方法2:在 Java 中格式化结果
将查询结果转换为 BigDecimal 并手动格式化:
import java.math.BigDecimal;
import java.text.DecimalFormat;BigDecimal value = resultSet.getBigDecimal("your_column");
DecimalFormat df = new DecimalFormat("0.00"); // 强制保留两位小数
String formattedValue = df.format(value);     // 输出 "0.10"
 
**方法3:修改 JDBC 驱动的格式化行为 **
 
在连接字符串中添加参数,关闭驱动的默认格式化:
String url = "jdbc:oracle:thin:@localhost:1521:ORCL?oracle.jdbc.defaultNumericChar=true";
 
注意:
此参数可能因驱动版本不同而失效,建议优先使用方法1或2。
方法4:直接处理结果集
如果查询结果已经是字符串形式的 ".1",可以手动补零:
String rawValue = resultSet.getString("your_column");
if (rawValue.startsWith(".")) {rawValue = "0" + rawValue; // ".1" → "0.1"
}
 
验证数据库实际存储值
执行以下 SQL,确认数据库中实际存储的值:
SELECT DUMP(your_number_column) FROM your_table;
 
- 输出示例:
Typ=2 Len=2: 193,11(表示存储的是0.10,但查询时被格式化)。