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

时间:2011-02-22 06:18:24

标签: java oracle precision bigdecimal

考虑使用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。

2 个答案:

答案 0 :(得分:4)

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

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

当你使用float或double时,jdbc驱动程序知道我不能依赖所有数字而忽略了那个阈值之后的数据。

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

===另一次更正====

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

BTW:你真的应该为此使用绑定变量。

答案 1 :(得分:3)

对于文字值,您应该始终使用BigDecimal构造函数来获取字符串参数。有关详细信息,请参阅documentation of the BigDecimal(double) constructor