postgresql中的round函数实际上是如何工作的? 下面的查询演示了奇怪的行为
select
val
,Round(x.val::NUMERIC) as NUMERIC_Round
,Round(x.val::DOUBLE PRECISION) as DOUBLE_Round
from
generate_series(-10.5,10.5,0.5) as x(val)
当Val
采取' 10.5',' 6.5',' 4.5'圆的结果是不同的。
Docs这样说 双精度:
round(dp or numeric) (same as input) round to nearest integer
表示数字:
round(v numeric, s int) numeric round to s decimal places
这并不能解释为什么' 10.5' 6.5',' 4.5'是不同的。 我究竟做错了什么? 可能有一些详细的解释可以帮助理解圆函数。
答案 0 :(得分:2)
This page表示不同数据类型之间的舍入差异:
类型
decimal
和numeric
是等效的。这两种类型都是SQL标准的一部分。对值进行舍入时,
numeric
类型的舍入值与零相关,而(在大多数计算机上)real
和double precision
类型舍入到最近的偶数。例如:SELECT x, round(x::numeric) AS num_round, round(x::double precision) AS dbl_round FROM generate_series(-3.5, 3.5, 1) as x; x | num_round | dbl_round ------+-----------+----------- -3.5 | -4 | -4 -2.5 | -3 | -2 -1.5 | -2 | -2 -0.5 | -1 | -0 0.5 | 1 | 0 1.5 | 2 | 2 2.5 | 3 | 2 3.5 | 4 | 4 (8 rows)
pgsql-hackers邮件列表上有关于更改here的讨论。