java - 在 JDBC 插入中用随机数填充的 BigDecimal 变量

标签 java oracle precision bigdecimal

考虑 SQL 语句 INSERT INTO table (field) VALUES (-0.11111111) with field Oracle type NUMBER。

当要插入的值是 float 或 double 类型时,您会在 field 中得到准确的值,即 -0.11111111。

但是当要插入的值是 BigDecimal 类型时,您会得到用随机数填充的值,即 0.1111111099999999990428634077943570446223。

为什么?

Java 声明“BigDecimal 是不可变的、任意精度的带符号十进制数。”

代码是:

String sql = "INSERT INTO pat_statistics (file_key,test_number,rqw)"
    + " VALUES (3778, 100, " + new BigDecimal(-0.11111111) + ")";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, pwd);
Statement st = conn.createStatement();
int n = st.executeUpdate(sql);

数据库是 Oracle。

最佳答案

您正在从 float 创建 BigDecimal,因此它将准确反射(reflect) float 的值,并且您可能知道 float 的尾随数字更多或更少随机。

我假设您在数据库中看到了这个数据,因为 jdbc 驱动程序认为:嘿,我得到了一个 BigDecimal。我可以使用我能掌握的所有数字。

当您使用 float 或 double 时,jdbc 驱动程序知道我不能依赖所有数字并忽略该阈值之后的内容。

如果您需要 Big Decimal 的额外精度,请从 String 创建它或从 Integegers 计算它。

=== 另一个更正 ====

处理不是由 jdbc 驱动程序完成的,而是由各种 toString 转换完成的,因为您正在组装 SQL 字符串。

顺便说一句:你真的应该为此使用绑定(bind)变量。

关于java - 在 JDBC 插入中用随机数填充的 BigDecimal 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5074735/

相关文章:

wolfram-mathematica - 我的Mathematica程序中存在较大的数值错误

java - 创建字符串或整数条件

java - Apache Maven : cannot find symbol and invalid target release error (NetBeans support for Mule Plugin)

java - 我尝试在 Java 8 流 API 中找到一种简单的方法来进行分组

mysql - 提取具有最大值的行

mysql - 当表中有多个带有 col val1 的行时,如何从列值 2 中不包含特定值的表中获取不同的列 value1?

php - 多边形算法中的点有时会给出错误的结果

java - 我有两个具有相同内容但具有不同哈希码的字符串,因此 .equals 方法返回 false。请建议如何解决这个问题

sql - SELECT 子句使用 IN ... 很慢?

Fortran:将 double 复数转换为单精度