postgresql - 意外的舍入行为

标签 postgresql

我有一些 PostgreSQL 代码产生了意想不到的结果(或完全在意料之中,我试图理解原因。)

我的理论是,它与 date_part 返回 double precision 并在舍入前将其除以整数有关,但我真的不确定。 例如:

ROUND(45/10) = 4
ROUND(45.0/10) = 5

我已经在以下方面验证了此行为: x86_64-apple-darwin18.2.0 上的 PostgreSQL 11.2,由 Apple LLVM 版本 10.0.0 (clang-1000.11.45.5) 编译,64 位 和: x86_64-pc-linux-gnu 上的 PostgreSQL 10.7 (Ubuntu 10.7-1.pgdg16.04+1),由 gcc 编译 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609,64 位

SELECT
       ROUND(DATE_PART('minute', '2019-07-30 23:55') / 10) AS "ROUND(5.5)",
       ROUND(DATE_PART('minute', '2019-07-30 23:45') / 10) AS "ROUND(4.5)",
       ROUND(DATE_PART('minute', '2019-07-30 23:35') / 10) AS "ROUND(3.5)",
       ROUND(DATE_PART('minute', '2019-07-30 23:25') / 10) AS "ROUND(2.5)",
       ROUND(DATE_PART('minute', '2019-07-30 23:15') / 10) AS "ROUND(1.5)",
       ROUND(DATE_PART('minute', '2019-07-30 23:05') / 10) AS "ROUND(0.5)"

我的预期结果是:

6, 5, 4, 3, 2, 1

实际结果是:

6, 4, 4, 2, 2, 0

最佳答案

您使用的是不精确的数据类型:

SELECT
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:55')::NUMERIC(10,5) / 10) AS "ROUND(5.5)",
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:45')::NUMERIC(10,5) / 10) AS "ROUND(4.5)",
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:35')::NUMERIC(10,5) / 10) AS "ROUND(3.5)",
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:25')::NUMERIC(10,5) / 10) AS "ROUND(2.5)",
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:15')::NUMERIC(10,5) / 10) AS "ROUND(1.5)",
 ROUND(DATE_PART('minute',TIMESTAMP '2019-07-30 23:05')::NUMERIC(10,5) / 10) AS "ROUND(0.5)"

db<>fiddle demo

关于postgresql - 意外的舍入行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311140/

相关文章:

postgresql - IBM Bluemix 容器上的 Kubernetes 上的 Postgres

sql - PL/pgSQL 中的动态多维数组

sql - Postgres,选择条件

java - 地理上分散的服务器、PostgreSQL 和 JPA

sql - Postgres : return first N rows per group for groups having a minimum countI

postgresql - 如何防止在父表中插入?

sql - 为什么加入需要花费大量时间来执行?

c# - InvalidCastException : Unable to cast object of type 'System.DBNull' to type 'System.Nullable` 1[System. Int32]'

c - 这个 Makefile 有什么问题? (找不到头文件)

python - 将数据从 MySQL 数据库移植到 PostgreSQL