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

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

declare @value decimal(18,2)

set @value = 123.456

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
203
0
671 470
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

select convert(int,@value)

Это не то, чего хотела ОП. Ему все еще нужны десятичные разряды, но он хочет удалить их (усечение), а не округлять. I.E. 123.456 -> 123.45 НЕ 123.456 -> 12.46 и НЕ 123.456 -> 123

John 28.06.2012 18:57
Ответ принят как подходящий

select round(123.456, 2, 1)

Ответ должен объяснить, каковы параметры функции.

Tyler 25.09.2018 18:59

SQL ROUND (число, десятичные знаки, операция): операция -> Если 0, результат округляется до десятичного числа. Если значение отличается от 0, результат обрезается до числа десятичных знаков. По умолчанию 0

Midhun Darvin 14.01.2019 12:17

вы спасаете жизнь, у меня была сумма, показывающая только последние две цифры «1.9991666», однако она всегда округлялась до 2 независимо от того, что я использую, с этим я могу добиться чего-то вроде этого - выберите FORMAT (round (1.9991666 , 2, 1), 'N2') AS 'Оценить', Спасибо, друг

Spider 24.05.2020 08:21

Для этого, например: он не возвращает значение: 123,45, а возвращает значение 123,450. Прошу совета и помощи. Я использую SQL 14

Mufaddal 02.09.2020 11:17

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

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

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

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

select round(@value,2)

Извините, если я не понял, мне нужно сохранить десятичные знаки, просто отбросьте те, которые мне не нужны. Например, вместо того, чтобы преобразовать 123,456 в моем примере выше в 123,46 ... я хочу отбросить третий десятичный знак и сделать его 123,45.

Ryan Eastabrook 04.09.2008 19:55

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 Точность округления числового_выражения. length должно быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, числовое_выражение округляется до количества десятичных разрядов, заданных длиной. Когда длина является отрицательным числом, числовое_выражение округляется слева от десятичной точки, как указано длиной.

  • function Тип выполняемой операции. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), numeric_expression округляется. Если указано значение, отличное от 0, numeric_expression усекается.

Кто-нибудь знает, какие значения аргумента функции соответствуют tinyint, smallint и int? Microsoft исключила эту часть из своей документации и нигде не может найти ответ. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Dave 16.11.2016 16:51

MS SQL SERVER округляет числа немного иначе, чем IQ. Чтобы исправить это, используйте функцию round (x, y, z), как в этом раунде (val1 / val2,4,1)

Warren LaFrance 27.04.2017 18:48

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

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

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

    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

+1 для Floor(), что позволяет отказаться от десятичных дробей без округления. Слишком плохо Floor () не имеет второго параметра, указывающего, в какой позиции. Но я думаю, что * 10) / 10 действительно хорошо справляется с этим.

deroby 15.12.2011 15:30

SELECT Cast(Round(123.456,2,1) as decimal(18,2))

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

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

select @val

Выход 123,46

1) 3-я строка совершенно не нужна 2) он прямо сказал, что не хочет округлять число, а обрезает его (результат должен быть 123,45)

Damián Pablo González 03.07.2019 19:03

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

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

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

Выберите раунд (123,456, 2, 1) будет = 123,450

Bikram 30.01.2018 01:47

Я не понимаю, почему это вызывает положительные голоса. Вышеуказанное даст вам 123,450 и 123,460 соответственно.

remykarem 28.02.2018 10:12

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

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

SELECT @val - ROUND(@val,0,1)

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

SELECT ROUND(@val,0,1)

Это не. SELECT ROUND (123.4560,0,1) вместо этого дает 123.0000.

remykarem 28.02.2018 10:13

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

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

Я не понимаю этого ответа. Данный SQL приводит к 10.01, что является правильным округлением 10.0055 до двух десятичных знаков. Если последний параметр не равен 0, значение усекается (до 2 десятичных знаков) до 10,00.

8128 18.05.2020 11:41

Другой способ - функция 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 с 3-м параметром, установленным на 1.

Скалярная функция ODBC - другая альтернатива!

Arulmouzhi 12.02.2020 20:52

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

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

Ваш пример:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

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

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

Кстати, вы воссоздаете программу из фильма «Офисное пространство»?

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

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

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

Problem statement: Query the greatest value of the Northern Latitudes (LAT_N) from STATION that is less than 137.2345. Truncate your answer to 4 decimal places.

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)

Я не верю, что это правильно. Рассмотрим следующий случай и обратите внимание, что результат округляется, а не усечен. OP хочет, чтобы это было усечено. `DECLARE @ N1 AS DECIMAL (10,7) = 123.1234789` PRINT @ N1 `SELECT CAST (@ N1 AS DECIMAL (10,4))

mandy1339 29.11.2020 05:42

Попробуйте вот так:

SELECT cast(round(123.456,2,1) as decimal(18,2)) 

ROUND(number, decimals, operation)

число => Обязательно. Число, которое нужно округлить decimals => Обязательно. Число десятичных знаков для округления числа до
операция => Необязательно. Если 0, результат округляется до десятичного числа. Если значение отличается от 0, результат обрезается до числа десятичных знаков. Значение по умолчанию - 0

SELECT ROUND(235.415, 2, 1)

даст вам 235.410

SELECT ROUND(235.415, 0, 1)

даст вам 235.000

Но теперь обрезая 0, вы можете использовать cast

SELECT CAST(ROUND(235.415, 0, 1) AS INT)

даст вам 235

Другие вопросы по теме