Усечение (не округление) десятичных знаков в SQL Server
Я пытаюсь определить лучший способ усечения или удаления дополнительных десятичных знаков в SQL без округления. Например:
declare @value decimal(18,2)
set @value = 123.456
это будет авто раунд @значение 123.46....что в большинстве случаев хорошо. Однако для этого проекта мне это не нужно. Есть ли простой способ усечь десятичные числа, которые мне не нужны? Я знаю, что могу использовать функцию left() и конвертировать обратно в десятичное число...есть другие способы?
16 ответов:
ROUND ( 123.456 , 2 , 1 )когда третий параметр != 0 он усекает, а не патронов
http://msdn.microsoft.com/en-us/library/ms175003 (SQL. 90). aspx
синтаксис
ROUND (numeric_expression, length [, function])
Аргументы
значение Это выражение точных или приблизительных числовых данных категория типа, за исключением типа данных bit.
длина Это точность, с которой значение должно быть округлено. длина должна быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, numeric_expression округляется до числа десятичных позиций, указанных длиной. Если length является отрицательным числом, значение numeric_expression округляется слева от десятичной запятой, как указано длина.
- функции Тип выполняемой операции. функция должна быть tinyint, smallint или int. Если функция опущена или имеет значение 0 (по умолчанию), выражение numeric_expression округляется. Если указано значение, отличное от 0, значение усекается.
вот как мне удалось усечь, а не округлить:
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))
раунд имеет необязательный параметр
Select round(123.456, 2, 1) will = 123.45 Select round(123.456, 2, 0) will = 123.46
еще одно усечение без округления решения и примера.
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 ceiling(@value),floor(@value)Если вы делаете это с 0, то сделайте раунд:
select round(@value,2)
Я знаю, что это довольно поздно, но я не вижу в этом ответа и использую этот трюк в течение многих лет.
просто вычесть .005 от вашего значения и использовать круглый (@num, 2).
ваш пример:
declare @num decimal(9,5) = 123.456 select round(@num-.005,2)возвращает 123.45
он автоматически отрегулирует округление до правильного значения, которое вы ищете.
кстати, вы воссоздаете программу из офисного пространства фильма?
пожалуйста, попробуйте использовать этот код для преобразования 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 ║ ╚═════════╩═════════╝замечание:
я рекомендую использовать встроенный
Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления. Это как преимущество возможность округлять действительно длинные числа (предел вашей строки в SQL server, который обычно составляет 8000 символов):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
Comments