Усеченные (не круглые) десятичные знаки в SQL Server - PullRequest
182 голосов
/ 04 сентября 2008

Я пытаюсь определить наилучший способ усечения или удаления лишних десятичных разрядов в SQL без округления. Например:

declare @value decimal(18,2)

set @value = 123.456

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

Ответы [ 16 ]

247 голосов
/ 04 сентября 2008
ROUND ( 123.456 , 2 , 1 )

Когда третий параметр ! = 0 он усекает, а не округляет

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Синтаксис

ROUND (числовое выражение, длина [, функция])

Аргументы

  • numeric_expression Выражение точных числовых или приблизительных числовых данных категория типа, кроме битового типа данных.

  • длина Точность, до которой округляется числовое выражение. длина должна быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, numeric_expression округляется до количества десятичных разрядов, указанных в length. Если длина является отрицательным числом, выражение numeric_expression округляется с левой стороны десятичной точки, как указано в length.

  • функция Тип операции для выполнения. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Если указано значение, отличное от 0, выражение numeric_expression усекается.
179 голосов
/ 04 сентября 2008
select round(123.456, 2, 1)
31 голосов
/ 05 мая 2009
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
13 голосов
/ 13 февраля 2009

Вот как мне удалось обрезать, а не округлять:

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

9 голосов
/ 31 декабря 2013

На самом деле, каким бы ни был третий параметр, 0 или 1 или 2, он не будет округлять ваше значение.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
8 голосов
/ 13 ноября 2009

Round имеет необязательный параметр

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
6 голосов
/ 13 февраля 2009

Еще одно усечение без округления и пример.

    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
6 голосов
/ 04 сентября 2008

Хотите десятичную или нет?

Если нет, используйте

select ceiling(@value),floor(@value)

Если вы сделаете это с 0, тогда сделайте раунд:

select round(@value,2)
4 голосов
/ 11 декабря 2009

Это удалит десятичную часть любого числа

SELECT ROUND(@val,0,1)
1 голос
/ 26 января 2017

Я знаю, что уже довольно поздно, но я не вижу в этом ответа и использую этот трюк годами.

Просто вычтите .005 из вашего значения и используйте Round (@ num, 2).

Ваш пример:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

возвращает 123,45

Он автоматически настроит округление до нужного значения, которое вы ищете.

Кстати, вы воссоздаете программу из фильма Office Space?

...