Вопрос округления Oracle - PullRequest
       4

Вопрос округления Oracle

1 голос
/ 17 декабря 2010

Я использую этот код для округления десятичного значения до следующего значения, кратного 25. То есть, если значение равно 33.60, оно должно округляться до 33.50

create or replace
PROCEDURE         "TEST1" (PQUERY IN VARCHAR2) as
 prNspValue number(14,2) :='';
 p_percentage_Value number(4,2) :='';
  begin
  prNspValue:=33.60;
  dbms_output.put_line(prNspValue); 
  p_percentage_Value:=substr(prNspValue,instr(prNspValue,'.')+1,length(prNspValue));
  dbms_output.put_line(p_percentage_value); 
  p_percentage_Value:=p_percentage_Value-mod(p_percentage_Value,25);
  dbms_output.put_line(p_percentage_value);
  if(p_percentage_Value!=0)then
    prNspValue:=substr(prNspValue,1,instr(prNspValue,'.'))+p_percentage_Value/100;
  else 
  prNspValue:=substr(prNspValue,1,instr(prNspValue,'.'));
  end if;
 dbms_output.put_line(prNspValue);     
end;

, но проблема в том, что значение равно 33.60.принимается за 33,6.так что округляется до 33.0.Как я могу исправить этот код?

1 Ответ

2 голосов
/ 17 декабря 2010

Вы можете использовать функцию округления напрямую FLOOR(your_number*4)/4:

SQL> WITH my_data AS (
  2     SELECT 33.00 num FROM dual
  3     UNION ALL SELECT 33.10 FROM dual
  4     UNION ALL SELECT 33.20 FROM dual
  5     UNION ALL SELECT 33.30 FROM dual
  6     UNION ALL SELECT 33.40 FROM dual
  7     UNION ALL SELECT 33.50 FROM dual
  8     UNION ALL SELECT 33.60 FROM dual
  9     UNION ALL SELECT 33.70 FROM dual
 10     UNION ALL SELECT 33.80 FROM dual
 11     UNION ALL SELECT 33.90 FROM dual
 12  ) SELECT num,
 13           floor (num * 4) / 4 rounded
 14      FROM my_data;

       NUM    ROUNDED
---------- ----------
        33         33
      33,1         33
      33,2         33
      33,3      33,25
      33,4      33,25
      33,5       33,5
      33,6       33,5
      33,7       33,5
      33,8      33,75
      33,9      33,75

10 rows selected
...