Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC Insert中用随机数填充的BigDecimal变量_Java_Oracle_Precision_Bigdecimal - Fatal编程技术网

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

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

考虑SQL语句
插入表(字段)值(-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。