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

BigDecimal variable padded with random numbers in JDBC Insert

提问人:Will Sumekar 提问时间:2/22/2011 更新时间:11/10/2023 访问量:2823

问:

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

当要插入的值的类型为 float 或 double 时,您将获得 中的确切值,即 -0.11111111。field

但是,当要插入的值为 类型时,您将获得用随机数填充的值,即 0.11111110999999999990428634077943570446223。BigDecimal

为什么?

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 精度 bigdecimal

评论


答:

4赞 Jens Schauder 2/22/2011 #1

您正在从 a 创建 BigDecimal,因此它将准确反映 的值,并且您可能知道浮点数的尾部数字更随机。doubledouble

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

当您使用或 JDBC 驱动程序知道我不能真正使用所有数字并忽略该阈值之后的内容时。floatdouble

如果您需要 的额外精度 ,则从 a 创建它或从 s 计算它。BigDecimalStringInteger

更正

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

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

评论

1赞 Will Sumekar 2/22/2011
谢谢Jens。稍微更正一下:BigDecimal 是从 double 创建的,而不是浮点数。
3赞 Jörn Horstmann 2/22/2011 #2

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