PostgreSQL JDBC驱动程序使作物双倍值

时间:2015-01-09 08:39:00

标签: java postgresql jdbc

我正在使用PostgreSql 9.3和postgresql-9.3-1101 JDBC驱动程序。 PreparedStatements有一个非常奇怪的行为。

以下是示例: 首先,我创建一个测试表:

CREATE TABLE double_test
(
   id          numeric(18)     NOT NULL
);

之后我运行以下代码:

DecimalFormat df = new DecimalFormat("0");
try {
    conn = BeanUtils.getBean("dataSource", DataSource.class).getConnection();
    conn.setAutoCommit(false);
    conn.createStatement().execute("DELETE from double_test ");
    conn.commit();
    PreparedStatement stmt = conn.prepareStatement("INSERT INTO double_test (id )VALUES (?)");
    double input = 1234567890123456d;
    System.out.println("Input:" + df.format(input));
    stmt.setDouble(1, input);
    stmt.execute();
    conn.commit();

    ResultSet rs = conn.createStatement().executeQuery("SELECT id FROM double_test ");
    rs.next();
    System.out.println("Output:" + df.format(rs.getDouble(1)));
    rs.close();
} catch (SQLException e1) {
    throw new RuntimeException(e1);
} finally {
    try {
        conn.close();
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}

代码的输出将是:

Input: 1234567890123456
Output:1234567890123460

这让我非常困惑,在Postgres JDBC驱动程序开始回合15位之后。插入的数据已损坏,无需另行通知!

我在这里错过了什么吗?我的代码有错误吗?

或者这是驱动程序中的错误?如果是这样,我真的很想知道没有人注意到这一点。

也许使用BigDecimal可以防止数据损坏,但这只是一种解决方法。

0 个答案:

没有答案