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

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

declare @value decimal(18,2)

set @value = 123.456

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

Ответы [ 16 ]

0 голосов
/ 27 марта 2018

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

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
0 голосов
/ 13 апреля 2016

Другим способом является 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.

0 голосов
/ 20 ноября 2009

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

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

SELECT @val - ROUND(@val,0,1)
0 голосов
/ 22 октября 2009

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

0 голосов
/ 01 июля 2009

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

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

select @val

Выход 123.46

0 голосов
/ 04 сентября 2008
select convert(int,@value)
...