首页 > 解决方案 > 为什么 SQL 中没有 ROUND(23/6) = 4?

问题描述

案例 A:当您尝试自己将结果四舍五入到最接近的小数时

SELECT  ROUND   (3.833333333333333) --  4 

案例 B:当您让 SQL 进行数学运算然后四舍五入到最接近的小数时

SELECT  ROUND   (23/6)          --  3   (OR CEIL)

在这种情况下,按照操作的顺序:

SQL将括号之间的内容分开,首先= 3.833333333333333

然后(这就是问题所在)它将删除小数点后的所有内容。(自动将其转换为 int)=3.0

现在,让我们对小数进行四舍五入(在上一步中已经删除了!现在它 = 0)

因此,最后的结果将是 (3)。不是(4)。!

即使有转换:

SELECT  CAST (DIV (23,6)    AS NUMERIC (10,5))  AS  tst -- 3.00000
SELECT  CAST ((23/6)     AS DECIMAL (5,2))      AS  tst -- 3.00
SELECT  CAST (23/6  AS FLOAT)           AS  tst -- 3
SELECT  CAST (23/6  AS REAL)            AS  tst -- 3

这个问题有解决方案吗?

标签: sqlpostgresql

解决方案


因为它执行整数除法。然后引擎评估:

ROUND (23/6)

表达式23/6首先被评估为3。然后:

ROUND (3)

被评估为3

如果你想要浮点精度,你可以乘以1.0. 例如通过这样做:

ROUND ( 1.0 * 23/6)

推荐阅读