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



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



declare @value decimal(18,2)

set @value = 123.456


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

2883   16  

16 ответов:

select round(123.456, 2, 1)
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 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)

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

просто вычесть .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

LiveDemo

выход:

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

замечание:

я рекомендую использовать встроенный

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

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)

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

Comments

    Ничего не найдено.