1

我使用 SpringJdbcTemplate运行插入 SQL 语句。我要插入的字段是NUMBER. 值为:-0.11111111类型float。但是,在插入 DB 后,我得到的值是用 random numbers 填充的-0.1111111119389534

请注意,当我使用直接 JDBC 时,该值按原样插入,没有填充数字。

我使用BeanPropertySqlParameterSourceandMapSqlParameterSource来设置 INSERT 语句的参数,两者都给出相同的结果。代码如下所示:

BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);

其中 jt 是 的瞬间SimpleJdbcTemplate

数据库是甲骨文。

谢谢你。

4

1 回答 1

2

对于 Java 的float数据类型,Spring JDBC 的行为与直接 JDBC 不同。

考虑Oracle 类型和浮点类型INSERT INTO table (field) VALUES (-0.11111111)的-0.11111111 的SQL 语句。fieldNUMBER

对于直接 JDBC,它按field原样给出值,即 -0.11111111。

但是使用 Spring JDBC(使用JdbcTemplate.update(),它给出了field用数字填充的值,即 -0.1111111119389534。

Java 类型没有这种差异double。插入的值不填充数字。

使用 Java datatype BigDecimal,插入到 DB 中的值也将用数字填充,即 -0.1111111099999999990428634077943570446223 这对于直接 JDBC 和 Spring JDBC 都是一致的。

结果float是可以理解的,正如 Java 在其文档中指出的那样,“(Float) 数据类型不应该用于精确值,例如货币。” 因此,即使直接 JDBC 和 Spring JDBC 的行为不同,我们也不能说它是错误的。

对于BigDecimal,请阅读http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29

于 2011-02-22T04:15:46.447 回答