簡體   English   中英

Oracle SQL-四舍五入

[英]Oracle SQL - Round - Half

默認情況下,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”結尾,並在這種情況下截斷最后一位數字,否則四舍五入,但是我感覺這效率低下(?)

謝謝 ! 大衛

該文檔向您展示了所使用的算法

  1. 如果n為0,則ROUND始終返回0,而不考慮整數。
  2. 如果n為負,則ROUND(n,integer)返回-ROUND(-n,integer)。
  3. 如果n為正,則
    ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)

因此,您可以修改正的非零版本:

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

例如,對於固定的舍入,現在暫時忽略零/負數:

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

您可以通過case表達式包含零/負數; 或編寫自己的函數來更整潔地處理它。

從值中剔除.001,然后正常舍入:

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

要舍入到3dp,請更改為-0.0001-0.0001

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM