Java中ResultSet.getDouble()非预期舍入问题如何解决?
解决ResultSet.getDouble()舍入为整数的问题
这问题我之前排查过类似的,大概率是JDBC驱动或者类型映射的小坑!先给你理清楚可能的原因和解决办法:
核心原因
一般来说,getDouble()返回截断值,而getObject()能拿到正确结果,主要是因为JDBC驱动对特定double数值的解析逻辑有问题——有些旧驱动会错误地把带有小数的double值当作整数处理,或者结果集元数据里的字段类型被驱动误判,导致读取时自动截断。
可行的解决办法
直接用getObject转Double:既然
getObject()能拿到正确值,那可以直接用这个方式转换,绕开驱动里有问题的getDouble()实现,代码示例:Double correctValue = (Double) rs.getObject("value");用BigDecimal中转后转double:如果担心类型转换的安全性,可以先读取为BigDecimal,再转成double,这种方式对数值的解析更严谨,能避免驱动的截断问题:
double correctValue = rs.getBigDecimal("value").doubleValue();升级JDBC驱动版本:很多时候这种问题是驱动的bug导致的,比如MySQL Connector/J的某些旧版本就存在类似的double值截断问题。把驱动升级到最新的稳定版,大概率能解决。
检查数据库字段和映射配置:再确认下数据库里的字段是不是真的是double类型(比如有没有被误设为DECIMAL(0)或者整数类型);如果用了ORM框架(比如MyBatis),检查结果映射里是不是把这个字段错误映射成了int/long类型,导致自动舍入。
内容的提问来源于stack exchange,提问作者Luca5om3
相关产品推荐
相关产品推荐

