我使用Spring的JdbcTemplate
来运行插入SQL语句。我要插入的字段是NUMBER
。值为:-0.11111111
,类型为float
。但是,在插入DB之后,我得到的值用随机数-0.1111111119389534
填充。
请注意,当我使用直接JDBC时,将按原样插入值,而不使用填充数字。
我使用BeanPropertySqlParameterSource
和MapSqlParameterSource
来设置INSERT语句的参数,两者都给出相同的结果。代码如下所示:
BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);
其中jt是SimpleJdbcTemplate
的瞬间。
数据库是Oracle。
谢谢。
答案 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