通过jdbc查询结果不正确
通过jdbc驱动程序Snowflake-jdbc-3.12.5.jar从Snowflake查询值时,结果不正确通过jdbc查询结果不正确,jdbc,snowflake-cloud-data-platform,Jdbc,Snowflake Cloud Data Platform,通过jdbc驱动程序Snowflake-jdbc-3.12.5.jar从Snowflake查询值时,结果不正确 雪花中的表格定义: 通过jdbc驱动程序snowflake-jdbc-3.12.5.jar查询表“test_dob”中的值 您可以得到第一列(“dob”)的查询值不正确,但第二列(“rel”)是正确的 这是驱动程序的错误吗?用于SQL类型DECIMAL的ResultSet方法是 通过ResultSet::getDouble(col)请求一个double类型,您强制转换基础数字表示 鉴于
DECIMAL
的ResultSet
方法是
通过ResultSet::getDouble(col)
请求一个double
类型,您强制转换基础数字表示
鉴于SQL decimal/number数据类型中的刻度不同(3
和5
),对于每种情况,到double
的转换处理方式不同。对于较小的比例尺(3
),由于其有限的位宽度,a与传输的值相对应,并且实际上在其下面使用了一个浮点类型,该类型向上转换为双精度。对于较大的刻度(5
),使用一个正则整数,并直接进行计算
下面是一个纯Java(via)表示的幕后活动
~>jshell
jshell>short sv=990;//3级
jshell>(双)((浮子)sv/(浮子)1000l)
$n==>0.990000095367432
jshell>intiv=99000;//五级
jshell>(双倍)((双倍)iv/(双倍)100000升)
$n==>0.99
这是司机的错误吗
在字节
/短
/int
案例中执行的双
转换当然可以统一以改进行为,但除了将0.99
用作测试示例外,它无法解决问题。其他无法在double
中精确表示的DECIMAL
类型数字将继续出现
由于用于表示每种类型的位,转换都是有效的,从驱动程序正确性的角度来看,这两种转换都是有效的,因为通过要求使用双精度
代替大十进制
,表示您不需要对所检索的数字进行精确表示
如果需要精度/正确性(例如用于处理货币或某些科学应用),请使用以下方法:
System.out.print(rs.getBigDecimal(j)+“,”);
要了解float
和double
类型的有损精度,请阅读:用于DECIMAL
的SQL类型的ResultSet
方法是
通过ResultSet::getDouble(col)
请求一个double
类型,您强制转换基础数字表示
鉴于SQL decimal/number数据类型中的刻度不同(3
和5
),对于每种情况,到double
的转换处理方式不同。对于较小的比例尺(3
),由于其有限的位宽度,a与传输的值相对应,并且实际上在其下面使用了一个浮点类型,该类型向上转换为双精度。对于较大的刻度(5
),使用一个正则整数,并直接进行计算
下面是一个纯Java(via)表示的幕后活动
~>jshell
jshell>short sv=990;//3级
jshell>(双)((浮子)sv/(浮子)1000l)
$n==>0.990000095367432
jshell>intiv=99000;//五级
jshell>(双倍)((双倍)iv/(双倍)100000升)
$n==>0.99
这是司机的错误吗
在字节
/短
/int
案例中执行的双
转换当然可以统一以改进行为,但除了将0.99
用作测试示例外,它无法解决问题。其他无法在double
中精确表示的DECIMAL
类型数字将继续出现
由于用于表示每种类型的位,转换都是有效的,从驱动程序正确性的角度来看,这两种转换都是有效的,因为通过要求使用双精度
代替大十进制
,表示您不需要对所检索的数字进行精确表示
如果需要精度/正确性(例如用于处理货币或某些科学应用),请使用以下方法:
System.out.print(rs.getBigDecimal(j)+“,”);
要了解float
和double
类型的有损精度,请阅读:
create table test_dob(DOB DECIMAL(38,3),REL DECIMAL(38,5));
insert into test_dob values(0.99, 0.99);
.....
Connection conn = DriverManager.getConnection("jdbc:snowflake://XXXXX.aws.snowflakecomputing.com?db=testdbu", "user", "password");
......
String sql = "select dob,rel from test_dob";
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
for (int j = 1; j < rs.getMetaData().getColumnCount() + 1; j++) {
//System.out.print(rs.getString(j) + ",");
System.out.print(rs.getDouble(j) + ",");
}
.......
0.9900000095367432,0.99,