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

StackOverflow https://stackoverflow.com/questions/44046

  •  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

LiveDemo

Выходной сигнал:

╔═════════╦═════════╗
║   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) это самый простой способ, я думаю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top