Я пытаюсь определить лучший способ усечь или удалить лишние десятичные знаки в SQL без округления. Например:
declare @value decimal(18,2)
set @value = 123.456
Это автоматически округлит @value до 123.46, что в большинстве случаев хорошо. Однако для этого проекта мне это не нужно. Есть ли простой способ обрезать десятичные дроби, которые мне не нужны? Я знаю, что могу использовать функцию left() и преобразовать обратно в десятичное число. Есть ли другие способы?


select convert(int,@value)
select round(123.456, 2, 1)
Ответ должен объяснить, каковы параметры функции.
SQL ROUND (число, десятичные знаки, операция): операция -> Если 0, результат округляется до десятичного числа. Если значение отличается от 0, результат обрезается до числа десятичных знаков. По умолчанию 0
вы спасаете жизнь, у меня была сумма, показывающая только последние две цифры «1.9991666», однако она всегда округлялась до 2 независимо от того, что я использую, с этим я могу добиться чего-то вроде этого - выберите FORMAT (round (1.9991666 , 2, 1), 'N2') AS 'Оценить', Спасибо, друг
Для этого, например: он не возвращает значение: 123,45, а возвращает значение 123,450. Прошу совета и помощи. Я использую SQL 14
Вы хотите десятичную дробь или нет?
Если нет, используйте
select ceiling(@value),floor(@value)
Если вы сделаете это с 0, сделайте раунд:
select round(@value,2)
Извините, если я не понял, мне нужно сохранить десятичные знаки, просто отбросьте те, которые мне не нужны. Например, вместо того, чтобы преобразовать 123,456 в моем примере выше в 123,46 ... я хочу отбросить третий десятичный знак и сделать его 123,45.
ROUND ( 123.456 , 2 , 1 )
Когда третий параметр ! = 0 усекает, а не округляет
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Синтаксис
ROUND ( numeric_expression , length [ ,function ] )
Аргументы
numeric_expression
Выражение точных числовых или приблизительных числовых данных
категория типа, за исключением битового типа данных.
length
Точность округления числового_выражения. length должно быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, числовое_выражение округляется до количества десятичных разрядов, заданных длиной. Когда длина является отрицательным числом, числовое_выражение округляется слева от десятичной точки, как указано длиной.
function
Тип выполняемой операции. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), numeric_expression округляется. Если указано значение, отличное от 0, numeric_expression усекается.Кто-нибудь знает, какие значения аргумента функции соответствуют tinyint, smallint и int? Microsoft исключила эту часть из своей документации и нигде не может найти ответ. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
MS SQL SERVER округляет числа немного иначе, чем IQ. Чтобы исправить это, используйте функцию round (x, y, z), как в этом раунде (val1 / val2,4,1)
Вот как я смог усечь, а не округлить:
select 100.0019-(100.0019%.001)
возвращает 100.0010
И ваш пример:
select 123.456-(123.456%.001)
возвращает 123.450
Теперь, если вы хотите избавиться от конечного нуля, просто введите его:
select cast((123.456-(123.456%.001)) as decimal (18,2))
возвращает 123,45
Еще одно усечение без решения и примера округления.
Convert 71.950005666 to a single decimal place number (71.9)
1) 71.950005666 * 10.0 = 719.50005666
2) Floor(719.50005666) = 719.0
3) 719.0 / 10.0 = 71.9
select Floor(71.950005666 * 10.0) / 10.0
+1 для Floor(), что позволяет отказаться от десятичных дробей без округления. Слишком плохо Floor () не имеет второго параметра, указывающего, в какой позиции. Но я думаю, что * 10) / 10 действительно хорошо справляется с этим.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Попробуйте использовать этот код для преобразования трех десятичных значений после точки в два десятичных знака:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
Выход 123,46
1) 3-я строка совершенно не нужна 2) он прямо сказал, что не хочет округлять число, а обрезает его (результат должен быть 123,45)
Я думаю, что Mod(x,1) - самый простой способ.
Round имеет необязательный параметр
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
Выберите раунд (123,456, 2, 1) будет = 123,450
Я не понимаю, почему это вызывает положительные голоса. Вышеуказанное даст вам 123,450 и 123,460 соответственно.
Я думаю, вам нужно только десятичное значение, в этом случае вы можете использовать следующее:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
Это удалит десятичную часть любого числа
SELECT ROUND(@val,0,1)
Это не. SELECT ROUND (123.4560,0,1) вместо этого дает 123.0000.
Фактически, каким бы ни был третий параметр, 0, 1 или 2, он не будет округлять ваше значение.
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Я не понимаю этого ответа. Данный SQL приводит к 10.01, что является правильным округлением 10.0055 до двух десятичных знаков. Если последний параметр не равен 0, значение усекается (до 2 десятичных знаков) до 10,00.
Другой способ - функция ODBC TRUNCATE:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
Выход:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
Замечание:
Я рекомендую использовать встроенную функцию ROUND с 3-м параметром, установленным на 1.
Скалярная функция ODBC - другая альтернатива!
Я знаю, что это довольно поздно, но я не вижу в этом ответа и уже много лет использую этот трюк.
Просто вычтите 0,005 из своего значения и используйте Round (@ num, 2).
Ваш пример:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
возвращает 123,45
Он автоматически настроит округление до нужного значения, которое вы ищете.
Кстати, вы воссоздаете программу из фильма «Офисное пространство»?
Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления. Это преимущество в возможности округлять действительно длинные числа (ограничение вашей строки на SQL-сервере, которое обычно составляет 8000 символов):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
Я думаю, что мы можем пойти намного проще с более простым примером решения, найденным в Hackerrank:
Problem statement: Query the greatest value of the Northern Latitudes (LAT_N) from STATION that is less than 137.2345. Truncate your answer to 4 decimal places.
SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;
Решение Выше показано, как просто ограничить значение 4 десятичными знаками. Если вы хотите уменьшить или увеличить числа после десятичной дроби, просто измените 4 на все, что захотите.
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;
Дала бы вам 2 значения после десятичной точки. (СЕРВЕР MS SQL)
Я не верю, что это правильно. Рассмотрим следующий случай и обратите внимание, что результат округляется, а не усечен. OP хочет, чтобы это было усечено. `DECLARE @ N1 AS DECIMAL (10,7) = 123.1234789` PRINT @ N1 `SELECT CAST (@ N1 AS DECIMAL (10,4))
Попробуйте вот так:
SELECT cast(round(123.456,2,1) as decimal(18,2))
ROUND(number, decimals, operation)
число => Обязательно. Число, которое нужно округлить
decimals => Обязательно. Число десятичных знаков для округления числа до
операция => Необязательно. Если 0, результат округляется до десятичного числа. Если значение отличается от 0, результат обрезается до числа десятичных знаков. Значение по умолчанию - 0
SELECT ROUND(235.415, 2, 1)
даст вам 235.410
SELECT ROUND(235.415, 0, 1)
даст вам 235.000
Но теперь обрезая 0, вы можете использовать cast
SELECT CAST(ROUND(235.415, 0, 1) AS INT)
даст вам 235
Это не то, чего хотела ОП. Ему все еще нужны десятичные разряды, но он хочет удалить их (усечение), а не округлять. I.E. 123.456 -> 123.45 НЕ 123.456 -> 12.46 и НЕ 123.456 -> 123