我有一些 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)"
关于postgresql - 意外的舍入行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311140/