BigDecimal的变量填充用JDBC插入随机数(BigDecimal variable padd

2019-09-28 01:07发布

考虑SQL语句INSERT INTO table (field) VALUES (-0.11111111)field甲骨文型号。

如果要插入的值是float类型或双的,你得到的确切价值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。

Answer 1:

对于文字值,你应该经常使用的BigDecimal构造采取一个字符串参数。 请参阅通过BigDecimal(double)构造的文档了解详情。



Answer 2:

您是从浮创建的BigDecimal所以它会反映浮动的完全价值,因为你可能知道一个浮动的结尾数字是更矿石较少随机的。

我假设你看到这个诠释他的数据库,因为JDBC驱动程序认为:嘿,我得到一个BigDecimal。 我可以用我能掌握的数字。

当你使用float或double JDBC驱动程序都知道我上无法依赖于所有的数字而忽略门限后会发生什么。

如果您需要大十进制的附加精度,字符串创建或从Integegers计算。

===另一校正====

该处理不被JDBC驱动程序完成的,而是由不同的toString转换,因为你是你的组装SQL字符串。

BTW:你真的应该使用绑定变量这一点。



文章来源: BigDecimal variable padded with random numbers in JDBC Insert