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

发布于 2024-10-18 08:05:42 字数 549 浏览 3 评论 0原文

我使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

芯好空 2024-10-25 08:05:43

对于 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%29

For Java's float datatype, Spring JDBC behaves differently than direct JDBC.

Consider SQL statement INSERT INTO table (field) VALUES (-0.11111111) with field Oracle type NUMBER 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 of field 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文