通过jdbc查询结果不正确

通过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类型,您强制转换基础数字表示 鉴于

通过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
    类型,您强制转换基础数字表示

    鉴于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,