Усеченные (не круглые) десятичные знаки в SQL Server

sql sql-server tsql rounding

599578 просмотра

17 ответа

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

declare @value decimal(18,2)

set @value = 123.456

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

Автор: Ryan Eastabrook Источник Размещён: 02.09.2019 06:44

Ответы (17)


179 плюса

Решение
select round(123.456, 2, 1)
Автор: Jimmy Размещён: 04.09.2008 03:54

252 плюса

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 усекается.
Автор: Jeff Cuscutis Размещён: 04.09.2008 04:11

31 плюса

SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Автор: Allen Размещён: 05.05.2009 07:58

13 плюса

Вот способ, которым я смог усечь, а не округлять:

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

Автор: Blake Размещён: 12.02.2009 10:54

9 плюса

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

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Автор: Jai Размещён: 31.12.2013 01:40

8 плюса

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

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
Автор: Quentin Размещён: 12.11.2009 10:33

6 плюса

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

    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
Автор: James Размещён: 12.02.2009 11:03

6 плюса

Вы хотите десятичную или нет?

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

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

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

select round(@value,2)
Автор: SQLMenace Размещён: 04.09.2008 03:57

4 плюса

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

SELECT ROUND(@val,0,1)
Автор: Probal Размещён: 11.12.2009 11:11

1 плюс

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

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

Ваш пример:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

возвращает 123.45

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

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

Автор: KeithL Размещён: 26.01.2017 07:24

0 плюса

Пожалуйста, попробуйте использовать этот код для преобразования 3 десятичных значений после точки в 2 десятичных знака:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

Выход 123.46

Автор: Jack Размещён: 01.07.2009 07:09

0 плюса

Я думаю, что вы хотите только десятичное значение, в этом случае вы можете использовать следующее:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)
Автор: Mohamed Размещён: 20.11.2009 11:16

0 плюса

Другой способ это ODBC TRUNCATEфункция:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Выход:

╔═════════╦═════════╗
║   val   ║ result  ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝

Примечание:

Я рекомендую использовать встроенную ROUNDфункцию с третьим параметром, установленным в 1.

Автор: Lukasz Szozda Размещён: 13.04.2016 06:44

0 плюса

Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления. Это как преимущество возможности округлять действительно длинные числа (предел вашей строки на сервере SQL, который обычно составляет 8000 символов):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
Автор: tukan Размещён: 27.03.2018 07:52

0 плюса

Я думаю, что мы можем пойти намного проще с более простым примером решения, найденным в Hackerrank:

Постановка проблемы: Запросите наибольшее значение северных широт (LAT_N) у STATION, которое меньше 137.2345. Усечь свой ответ до 4 десятичных знаков.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

Приведенное выше решение дает вам представление о том, как просто ограничить значение четырьмя десятичными знаками. Если вы хотите уменьшить или увеличить цифры после десятичной дроби, просто измените 4 на любое другое.

Автор: Ishwor Bhusal Размещён: 02.09.2019 03:42

-3 плюса

Mod(x,1) это самый простой способ, я думаю.

Автор: praxeo Размещён: 21.10.2009 10:02

-4 плюса

select convert(int,@value)
Автор: SQLMenace Размещён: 04.09.2008 03:52
Вопросы из категории :
32x32