您好,我想编写一个函数来对如下值进行四舍五入:
样本数据
select cast(22.5 as decimal(18,0)) --- > 22
select cast(22.51 as decimal(18,0)) --- > 23
select cast(22.49 as decimal(18,0)) --- > 22
我无法使用 round 函数实现要求,因为当值为 XX.5 时,它没有返回我预期的输出
select round(22.5) from dual;
Output: 23
But I need here 22.
谁能帮我实现这个要求。
答案 0 :(得分:1)
您可以在 MOD
表达式中使用 CASE
检查小数部分,然后使用 CEIL
或 FLOOR
:
SELECT value,
CASE
WHEN MOD(value, 1) > 0.5
THEN CEIL(value)
ELSE FLOOR(value)
END AS rounded
FROM table_name;
对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT 22.4 + 0.01 * ( LEVEL - 1 )
FROM DUAL
CONNECT BY LEVEL <= 20;
输出:
<块引用>VALUE | 圆形 |
---|---|
22.4 | 22 |
22.41 | 22 |
22.42 | 22 |
22.43 | 22 |
22.44 | 22 |
22.45 | 22 |
22.46 | 22 |
22.47 | 22 |
22.48 | 22 |
22.49 | 22 |
22.5 | 22 |
22.51 | 23 |
22.52 | 23 |
22.53 | 23 |
22.54 | 23 |
22.55 | 23 |
22.56 | 23 |
22.57 | 23 |
22.58 | 23 |
22.59 | 23 |
db<>fiddle here
答案 1 :(得分:0)
首先,你不能做你在问题中指定的事情。 decimal(18, 0)
没有小数点。所以这三个值只是 23、23 和 22,没有小数点。让我假设您打算将 decimal(18, 2)
作为数据类型。
我建议:
select ceil(val + 0.5) - 1
Here 是一个 db<>fiddle。
答案 2 :(得分:0)
首先是decimal(18,0) 不会将其转换为有效的小数,它会转换为整数。我认为最好将其转换为整数,但将其转换为任何整数会将 23.1 和 23.9 之间的所有值转换为 23,这在您的情况下不起作用。有一个 ROUND 函数,但它会转换如下
select ROUND(22.51) --- > 23 -- 如果以 .5 结尾,ROUND 会将小数四舍五入到下一个更高的数字
因此,适合您的情况的最佳解决方案是 FLOOR。如果数字以 0.5 结尾,FLOOR 将向下舍入到下一个最低值
选择楼层(22.51) --- > 22