Усечение (не округление) десятичных знаков в SQL Server
-
09-06-2019 - |
Вопрос
Я пытаюсь определить наилучший способ усечения или удаления лишних десятичных знаков в 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 ( числовое выражение , длина [ , функция ] )
Аргументы
числовое выражение Является выражением точных числовых или приблизительных числовых данных категория типа, за исключением битового типа данных.
длина Это точность, до которой должно быть округлено числовое выражение.длина должна быть выражением типа tinyint, smallint или int.Если length является положительным числом, numeric_expression округляется до количества десятичных разрядов, указанного в параметре length.Если length - отрицательное число, numeric_expression округляется с левой стороны от десятичной точки, как указано в параметре length.
- функция Это тип операции, которую необходимо выполнить.функция должна быть 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))
Раунд имеет необязательный параметр
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)
Это удалит десятичную часть любого числа
SELECT ROUND(@val,0,1)
Я знаю, что уже довольно поздно, но я не рассматриваю это как ответ и использую этот трюк в течение многих лет.
Просто вычтите 0,005 из вашего значения и используйте Round (@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 ║
╚═════════╩═════════╝
Замечание:
Я рекомендую использовать встроенный ROUND
функция с 3-м параметром, равным 1.
Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления.Это также дает возможность округлять действительно длинные числа (ограничение вашей строки в SQL server, которое обычно составляет 8000 символов).:
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
это самый простой способ, я думаю.