2016-04-21 3 views
0

Я ищу любой способ округлить или обрезать числа до двух цифр после запятой. Я пробовал с round, trunc и to_char. Но я не получил то, что хотел.Округление чисел до 2 цифр после запятой в оракуле

select round(123.5000,2) from dual; 
select round(123.5000,2) from dual; 

работает хорошо, но когда у меня есть ноль в качестве второго знака после запятой, я получаю только один 1 цифру после запятой в номере выхода

select to_char(23.5000, '99.99') from dual; 

работает отлично, но если число перед запятой имеет 3 цифры, я получаю '###' в качестве вывода. Кроме того, я начинаю здесь пробелы в начале. Есть ли четкий способ удалить эти пространства?

Я ищу способ всегда получать число с двумя цифрами после запятой и для всех чисел (1,10,100 и т. Д.).

+0

Вы не запрашиваете номер с двумя цифрами, вы запрашиваете строку. Вы действительно хотите число или строку? –

+0

Лучшее число, но может быть также sring в описываемом формате. – MaMu

ответ

4

Вы можете использовать the FM number format modifier подавить начальные пробелы, но обратите внимание, что вам также необходимо использовать .00, а не .99, и вы можете захотеть, чтобы последний элемент модели формата до десятичной точки также был равен нулю, если вы хотите, чтобы числа были меньше, чем 1, как показано, например, 0.50 вместо .50:

with t (n) as (
    select 123.5678 from dual 
    union all select 123.5000 from dual 
    union all select 23.5000 from dual 
    union all select 0 from dual 
    union all select 1 from dual 
    union all select 10 from dual 
    union all select 100 from dual 
) 
select n, 
    round(n, 2) as n2, 
    to_char(round(n, 2), '99999.99'), 
    to_char(round(n, 2), 'FM99999.00') as str2, 
    to_char(round(n, 2), 'FM99990.00') as str3 
from t; 

     N   N2 TO_CHAR(R STR2  STR3  
---------- ---------- --------- --------- --------- 
    123.5678  123.57 123.57 123.57 123.57 
    123.5  123.5 123.50 123.50 123.50 
     23.5  23.5  23.50 23.50  23.50  
     0   0  .00 .00  0.00  
     1   1  1.00 1.00  1.00  
     10   10  10.00 10.00  10.00  
     100  100 100.00 100.00 100.00 

Вам не обязательно нужен round(), так как это поведение по умолчанию, но не больно быть явным (кроме, возможно, крошечного влияния производительности на дополнительный вызов функции).

Это дает вам строку, а не цифру. Число не имеет завершающих нулей. Не имеет смысла описывать фактическое число в этих терминах. Имеет смысл иметь конечные нули при преобразовании числа в строку для отображения.

0

Вы пытались выполнить операцию литья?

Вы можете попробовать, например, с этим, очевидно, подставляя 30,2 с вашей желаемой точностью.

SELECT CAST (someNumber AS DECIMAL(30,2)) FROM dual 

Вы можете найти в документации по эксплуатации литой для Oracle SQL here

0

Попробуйте COLUMN команду с опцией FORMAT.

COLUMN COLUMN_NAME FORMAT 99.99 
SELECT COLUMN_NAME FROM TABLE_NAME .. 
2

Вы можете использовать:

select to_char(23.5000, 'fm999999999.00') 
from dual 

'fm' избегает начальные пробелы и '00' говорит всегда писать две цифры после запятой, даже если они равны 0. Это возвращает строку с вашим форматом.

Если нужно округлить число, а не только усечение цифры после второго, вы можете применить to_char к round() вашего номера

Смежные вопросы