PreparedStatement,浮点值和PostgreSQL

问题描述 投票:2回答:1

为什么使用setFloat的PreparedStatement与直接INSERT给出不同的结果(精度较低)?] >>

下面的代码显示了问题:

    Connection conn = createConnection();

/* here works as expected */
    String sql = "INSERT INTO teste values (1, -50.505050)";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.executeUpdate();

/* below, all values were saved with less precision */
    sql = "INSERT INTO teste values (?, ?)";
    ps = conn.prepareStatement(sql);

    ps.setInt(1, 2);
    ps.setFloat(2, -50.505050f);
    ps.executeUpdate();

    ps.setInt(1, 3);
    ps.setFloat(2, (float) -50.505050);
    ps.executeUpdate();

    ps.setInt(1, 4);
    ps.setFloat(2, Float.valueOf(-50.505050f));
    ps.executeUpdate();

    ps.setInt(1, 5);
    ps.setFloat(2, Float.valueOf("-50.505050"));
    ps.executeUpdate();

// with double works ok, but how? //
    ps.setInt(1, 6);
    ps.setDouble(2, -50.505050);
    ps.executeUpdate();

    ps.close();
    conn.close();

数据库是PostgreSQL,有两列,id(bigint)和valor(数字(9,6))。

这里是来自pgadmin4的输出。

pgadmin4 and saved data

pom.xml中唯一相关的依赖关系如下:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.8</version>
    </dependency>

我用于创建表的脚本。

CREATE TABLE public.teste
(
    id bigint NOT NULL,
    valor numeric(9,6),
    CONSTRAINT teste_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.teste
    OWNER to postgres;

我正在使用Java 11。

为什么带有setFloat的PreparedStatement给出与直接INSERT不同的结果(精度较低)?下面的代码显示了该问题:Connection conn = createConnection(); / *在这里用作...

java database postgresql jdbc prepared-statement
1个回答
0
投票

A float具有from 6 to 9 significant decimal digits precisiondouble具有from 15 to 17 significant decimal digits precision-50.505050是8位数字,略过float可以处理的限制。

如果打印,您可以自己看到。

© www.soinside.com 2019 - 2024. All rights reserved.