为什么使用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的输出。
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(); / *在这里用作...
A float
具有from 6 to 9 significant decimal digits precision。double
具有from 15 to 17 significant decimal digits precision。-50.505050
是8位数字,略过float
可以处理的限制。
如果打印,您可以自己看到。