在 JDBC Insert 中用随机数填充 BigDecimal 变量

问题描述 投票:0回答:2

考虑带有

INSERT INTO table (field) VALUES (-0.11111111)
Oracle 类型 NUMBER 的 SQL 语句
field

当要插入的值是 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。

java oracle precision bigdecimal
2个回答
4
投票

您正在从

double
创建 BigDecimal,因此它将准确反映
double
的值,并且您可能知道浮点数的尾随数字更加随机。

我假设您在数据库中看到了这一点,因为 JDBC 驱动程序认为:嘿,我得到了一个

BigDecimal
。我可以使用我能掌握的所有数字。

当您使用

float
double
时,JDBC 驱动程序知道我无法真正使用所有数字,并忽略该阈值之后的内容。

如果您需要

BigDecimal
的额外精度,请从
String
创建它或从
Integer
s 计算它。

更正

处理不是由 JDBC 驱动程序完成,而是由各种

toString
转换完成,因为您正在组装 SQL 字符串。

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


3
投票

对于文字值,您应该始终使用带有字符串参数的 BigDecimal 构造函数。有关详细信息,请参阅 BigDecimal(double) 构造函数的文档

© www.soinside.com 2019 - 2024. All rights reserved.