使用Spring JdbcTemplate用随机数填充DB精度

时间:2011-02-21 03:45:43

标签: java oracle precision jdbctemplate spring-jdbc

我使用Spring的JdbcTemplate来运行插入SQL语句。我要插入的字段是NUMBER。值为:-0.11111111,类型为float。但是,在插入DB之后,我得到的值用随机数-0.1111111119389534填充。

请注意,当我使用直接JDBC时,将按原样插入值,而不使用填充数字。

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

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

其中jt是SimpleJdbcTemplate的瞬间。

数据库是Oracle。

谢谢。

1 个答案:

答案 0 :(得分:2)

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

考虑SQL语句INSERT INTO table (field) VALUES (-0.11111111) field Oracle类型NUMBER和-0.11111111类型为float。

使用直接JDBC,它按原样给出field的值,即-0.11111111。

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

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

对于Java数据类型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