Oracle SQL - Round - Half

时间:2018-01-16 10:58:38

标签: 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

我需要将“降低一半”,这实际上意味着我应该得到以下结果:

 MY_NUMBER EXPECTED_ROUND_ON_NUMBER
---------- ------------------------
     3,674                     3,67
     3,675                     3,67
     3,676                     3,68

它应该很快,因为我需要在数百万件物品上这样做。

我可能会检测到数字是否以“5”结尾并在那种情况下截断最后一位数,否则就会圆,但我觉得这样效率不高(?)

谢谢! 大卫

2 个答案:

答案 0 :(得分:4)

文档shows you the algorithm used

  
      
  1. 如果n为0,则无论整数如何,ROUND始终返回0。
  2.   
  3. 如果n为负数,则ROUND(n,整数)返回-ROUND(-n,整数)。
  4.   
  5. 如果n为正,则为
      ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)
  6.   

所以你可以修改积极的非零版本:

FLOOR(n * POWER(10, integer) + 0.4) * POWER(10, -integer)
                                 ^

e.g。对于固定的舍入,现在忽略零/负:

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

您可以通过案例表达式包含零/负数;或编写自己的函数来更整齐地处理它。

答案 1 :(得分:1)

从值中敲出.001,然后正常循环:

select round(my_number-.001,2)
from MyTable

要舍入到3dp,请更改为-0.0001