2016-04-26 6 views
1

Ich möchte Zahlen in Oracle runden, um nur 2 Ziffern nach Komma zu behalten, die nur dem Wert der dritten Dezimalzahl folgen. Beispiel von dem, was Ich mag würde:Oracle Rundungsziffern nach Komma

1,374 --> 1,37 
1,375 --> 1,37 (the 5 need to be rounding down) 
1,3756 --> 1,37 (We only look the third decimal, even if the 4th is a 6) 
1,376 --> 1,38 

Wie würden Sie das tun? Ich habe die ROUND() -Funktion überprüft, aber das Verhalten ist nicht das, was ich brauche.

Vielen Dank für Ihre Hilfe

+0

Warum wollen Sie 1375 abzurunden [999 ...] * nach unten * auf 1,37, aber 1.376 * bis * 1,38? Das scheint eine ungewöhnliche Anforderung zu sein. –

+0

Vielen Dank für Ihre Antworten an Sie beide! Es war genau die Art von Trick, die ich suchte. Runde (Trunc (, 3) - 0,001, 2) -> Funktioniert perfekt – Seb63000

Antwort

1

Sie den Wert einstellen können Sie leicht gerundet sind, zB:

round(trunc(<your number>, 3) - 0.001, 2) 

Die trunc(<your number>, 3) bedeutet, dass alles nach der dritten Dezimalstelle ignoriert wird, so dass 1.3756 genauso behandelt wird wie 1.375. Die - 0.001 passt dann den abgeschnittenen Wert leicht an, so dass das normale Verhalten round() den Kipppunkt zwischen oben und unten statt auf .x5 auf .x6 erscheinen lässt.

Schnell Demo:

alter session set nls_numeric_characters =',.'; 

with t (n) as (
    select 1.37 from dual 
    union all select 1.374 from dual 
    union all select 1.374999 from dual 
    union all select 1.375 from dual 
    union all select 1.375001 from dual 
    union all select 1.3756 from dual 
    union all select 1.375999 from dual 
    union all select 1.376 from dual 
    union all select 1.37999 from dual 
) 
select n, round(n, 2) as simple, trunc(n, 3) as tmp1, trunc(n, 3) - 0.001 as tmp2, 
    round(trunc(n, 3) - 0.001, 2) as adjusted 
from t; 

     N  SIMPLE  TMP1  TMP2 ADJUSTED 
---------- ---------- ---------- ---------- ---------- 
     1,37  1,37  1,37  1,369  1,37 
    1,374  1,37  1,374  1,373  1,37 
    1,374999  1,37  1,374  1,373  1,37 
    1,375  1,38  1,375  1,374  1,37 
    1,375001  1,38  1,375  1,374  1,37 
    1,3756  1,38  1,375  1,374  1,37 
    1,375999  1,38  1,375  1,374  1,37 
    1,376  1,38  1,376  1,375  1,38 
    1,37999  1,38  1,379  1,378  1,38 
1

Verwendung round kombiniert mit floor oder trunc wie hier:

with t as (
    select column_value val 
    from table (sys.odcinumberlist(1.374, 1.375, 1.3756, 1.376))) 
select val, 
     round(trunc(val, 3)-.0001, 2) v1, 
     round((floor(val*1000)-1)/1000, 2) v2 
    from t 

Ausgang:

 VAL   V1   V2 
---------- ---------- ---------- 
    1,374  1,37  1,37 
    1,375  1,37  1,37 
    1,3756  1,37  1,37 
    1,376  1,38  1,38