Java JDBC Insert中用随机数填充的BigDecimal变量
考虑SQL语句Java JDBC Insert中用随机数填充的BigDecimal变量,java,oracle,precision,bigdecimal,Java,Oracle,Precision,Bigdecimal,考虑SQL语句插入表(字段)值(-0.11111111)和字段Oracle类型编号 当要插入的值为float或double类型时,您将在字段中获得准确的值,即-0.11111 但是,如果要插入的值的类型为BigDecimal,则会使用随机数填充该值,即0.11111110999999909428634077943557046223 为什么? Java声明“BigDecimal是一个不可变的、任意精度的有符号十进制数。” 代码是: String sql = "INSERT INTO pat_sta
插入表(字段)值(-0.11111111)
和字段
Oracle类型编号
当要插入的值为float或double类型时,您将在字段中获得准确的值,即-0.11111
但是,如果要插入的值的类型为BigDecimal
,则会使用随机数填充该值,即0.11111110999999909428634077943557046223
为什么?
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);
DB是Oracle。您正在从浮点创建BigDecimal,因此它将准确反映浮点的值,并且正如您可能知道的那样,浮点的尾随数字更多或更少随机
我假设您看到这个数据库是因为jdbc驱动程序认为:嘿,我得到了一个大的十进制数。我可以使用我能掌握的所有数字
当您使用float或double时,jdbc驱动程序知道我不能依赖所有的数字,并忽略阈值之后的内容
如果您需要大十进制的额外精度,可以从字符串创建它或从整数计算它
==另一次更正====
处理不是由jdbc驱动程序完成的,而是由各种toString转换完成的,因为您正在组装SQL字符串
顺便说一句:您真的应该使用绑定变量来实现这一点。您正在从浮点创建BigDecimal,这样它将准确反映浮点的值,并且您可能知道浮点的尾随数字更多或更少随机
我假设您看到这个数据库是因为jdbc驱动程序认为:嘿,我得到了一个大的十进制数。我可以使用我能掌握的所有数字
当您使用float或double时,jdbc驱动程序知道我不能依赖所有的数字,并忽略阈值之后的内容
如果您需要大十进制的额外精度,可以从字符串创建它或从整数计算它
==另一次更正====
处理不是由jdbc驱动程序完成的,而是由各种toString转换完成的,因为您正在组装SQL字符串
顺便说一句:你真的应该使用绑定变量来实现这一点。对于文本值,你应该始终使用BigDecimal构造函数来获取字符串参数。有关详细信息,请参阅。有关文本值,应始终使用带字符串参数的BigDecimal构造函数。有关详细信息,请参阅。谢谢Jens。稍微更正一下:BigDecimal是由double创建的,而不是float。谢谢Jens。稍微更正一下:BigDecimal是由double创建的,而不是float。