Ответ 1
select round(123.456, 2, 1)
Я пытаюсь определить лучший способ обрезать или отбрасывать лишние десятичные разряды в SQL без округления. Например:
declare @value decimal(18,2)
set @value = 123.456
Это автоматически @value
до 123.46
, что хорошо в большинстве случаев. Однако для этого проекта мне это не нужно. Есть ли простой способ обрезать десятичные дроби, которые мне не нужны? Я знаю, что могу использовать функцию left()
и конвертировать обратно в десятичную. Есть ли другие способы?
select round(123.456, 2, 1)
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
Точность, до которой округляется числовое выражение. длина должна быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, numeric_expression округляется до количества десятичных разрядов, указанных в length. Если длина - отрицательное число, выражение numeric_expression округляется в левой части десятичной точки, как указано в length.
function
Тип операции для выполнения. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Если указано значение, отличное от 0, выражение numeric_expression усекается.SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Вот как я смог усечь, а не раунд:
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
Фактически независимо от третьего параметра, 0 или 1 или 2, он не будет округлять ваше значение.
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Round имеет необязательный параметр
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
Вы хотите десятичное или нет?
Если нет, используйте
select ceiling(@value),floor(@value)
Если вы сделаете это с помощью 0, выполните раунд:
select round(@value,2)
Другое усечение без решения округления и примера.
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
Это приведет к удалению десятичной части любого числа
SELECT ROUND(@val,0,1)
Я знаю, что это довольно поздно, но я не вижу в этом ответа и много лет использую этот трюк.
Просто вычитайте .005 из своего значения и используйте Round (@num, 2).
Ваш пример:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
возвращает 123.45
Он автоматически настроит округление на нужное значение, которое вы ищете.
Кстати, воссоздаете ли вы программу из окна Office Space?
Попробуйте использовать этот код для преобразования 3 десятичных значений после точки в 2 десятичных знака:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
Вывод 123.46
Я думаю, вы хотите только десятичное значение, в этом случае вы можете использовать следующее:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
Другим способом является 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.
Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления. Это как преимущество возможности округлять действительно длинные числа (предел вашей строки на сервере SQL, который обычно составляет 8000 символов):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
Я думаю, что мы можем пойти намного проще с помощью простого примера решения, найденного в Hackerrank:
Постановка проблемы: запросите наибольшую ценность северных широт (LAT_N) от STATION, который меньше 137,2345. Усекни свой ответ до 4 знаков после запятой.
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 SERVER)
Mod(x,1)
- самый простой способ, я думаю.
select convert(int,@value)