【发布时间】:2020-09-24 02:57:42
【问题描述】:
为什么使用 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 (numeric (9,6))。
这是来自 pgadmin4 的输出。
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。
【问题讨论】:
-
感谢您的建议,我刚刚加入了。
-
为什么要尝试使用浮点数据类型将值插入精确的数字列?使用
BigDecimal会更合适,如果真的需要使用浮点类型,使用double,而不是float。 -
我不知道浮点类型 (java) 的小精度。 BigDecimal 对我来说也是新的。感谢您的提示!
标签: java database postgresql jdbc prepared-statement