Dav*_*vid 4 sql oracle rounding
默认情况下,Oracle ROUND 函数会将“一半向上”四舍五入:
select 3.674 my_number,
round(3.674,2) round_on_number
from dual
union
select 3.675 my_number,
round(3.675,2) round_on_number
from dual
union
select 3.676 my_number,
round(3.676,2) round_on_number
from dual
;
MY_NUMBER ROUND_ON_NUMBER
---------- ---------------
3,674 3,67
3,675 3,68
3,676 3,68
Run Code Online (Sandbox Code Playgroud)
我需要舍入“一半”,这基本上意味着我应该得到以下结果:
MY_NUMBER EXPECTED_ROUND_ON_NUMBER
---------- ------------------------
3,674 3,67
3,675 3,67
3,676 3,68
Run Code Online (Sandbox Code Playgroud)
它应该很快,因为我需要对数百万个项目执行此操作。
我可能会检测到数字是否以“5”结尾并在这种情况下截断最后一位数字,否则四舍五入,但我觉得这会效率低下(?)
谢谢 !大卫
该文档向您展示了使用的算法:
- 如果 n 为 0,则无论整数如何,ROUND 始终返回 0。
- 如果 n 为负,则 ROUND(n, integer) 返回 -ROUND(-n, integer)。
- 如果 n 为正,则
ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)
所以你可以修改正的非零版本:
FLOOR(n * POWER(10, integer) + 0.4) * POWER(10, -integer)
^
Run Code Online (Sandbox Code Playgroud)
例如对于固定舍入,现在忽略零/负:
with t (my_number) as (
select 3.674 from dual
union all select 3.675 from dual
union all select 3.676 from dual
)
select my_number,
floor(my_number * power(10, 2) + 0.4) * power(10, -2) as round_on_number
from t;
MY_NUMBER ROUND_ON_NUMBER
---------- ---------------
3.674 3.67
3.675 3.67
3.676 3.68
Run Code Online (Sandbox Code Playgroud)
您可以通过 case 表达式包含零/负数;或者编写自己的函数来更巧妙地处理它。
归档时间: |
|
查看次数: |
1689 次 |
最近记录: |