使用 Spring JdbcTemplate 用随机数填充 DB 精度
我使用 Spring 的 JdbcTemplate 来运行插入 SQL 语句。我要插入的字段是NUMBER
。该值为:-0.11111111
,类型为float
。然而,插入数据库后,我得到的值用随机数-0.1111111119389534
填充。
请注意,当我使用直接 JDBC 时,值按原样插入,没有填充数字。
我使用 BeanPropertySqlParameterSource 和 MapSqlParameterSource 来设置 INSERT 语句的参数,两者给出相同的结果。代码如下所示:
BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);
其中 jt 是 SimpleJdbcTemplate
的实例。
数据库是Oracle。
谢谢。
I use Spring's JdbcTemplate
to run an insert SQL statement. The field I want to insert into is a NUMBER
. The value is: -0.11111111
of type float
. However, after insertion into DB, the value I get is padded with random numbers -0.1111111119389534
.
Note that when I use direct JDBC, the value is inserted as it is, without the padded numbers.
I use BeanPropertySqlParameterSource
and MapSqlParameterSource
for setting the parameters of the INSERT statement, both giving same results. The code looks like this:
BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);
where jt is an instant of SimpleJdbcTemplate
.
The DB is Oracle.
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于 Java 的
float
数据类型,Spring JDBC 的行为与直接 JDBC 不同。考虑 SQL 语句
INSERT INTO table (field) VALUES (-0.11111111)
,其field
Oracle 类型NUMBER
和 float 类型的 -0.11111111。使用直接 JDBC,它会按原样给出
field
的值,即 -0.11111111。但是使用Spring JDBC(使用
JdbcTemplate.update()
),它给出用数字填充的field
的值,即-0.1111111119389534。对于Java类型
不会出现这样的差异double
。使用 Java 数据类型 BigDecimal,插入到 DB 中的值也将用数字填充,即 -0.1111111099999999990428634077943570446223,这对于直接 JDBC 是一致的。
float
的结果是可以理解的,因为 Java 在其文档中指出“(Float)数据类型永远不应该用于精确值,例如货币”。在直接 JDBC 和 Spring JDBC 中,我们不能说它是错误的。
对于
BigDecimal
,请阅读 http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29For Java's
float
datatype, Spring JDBC behaves differently than direct JDBC.Consider SQL statement
INSERT INTO table (field) VALUES (-0.11111111)
withfield
Oracle typeNUMBER
and -0.11111111 of type float.With direct JDBC, it gives the value of
field
as it is, i.e. -0.11111111.But with Spring JDBC (using
JdbcTemplate.update()
, it gives the value offield
padded with numbers, i.e. -0.1111111119389534.No such difference occurs for Java type
double
. The inserted value is not padded with numbers.With Java datatype
BigDecimal
, the inserted value into DB will also be padded with numbers, i.e. -0.1111111099999999990428634077943570446223 and this is consistent for both direct JDBC and Spring JDBC.The results for
float
is understandable, as Java states in its documentation that "(Float) data type should never be used for precise values, such as currency." So eventhough the behaviour is different in direct JDBC and Spring JDBC, we can't say it's wrong.For
BigDecimal
, read http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29