Pergunta

Estou tentando determinar a melhor maneira para truncar ou largar extra casas decimais no SQL sem arredondamento.Por exemplo:

declare @value decimal(18,2)

set @value = 123.456

Esta será automaticamente rodada @value para ser 123.46, o que é bom na maioria dos casos.No entanto, para este projeto, eu não preciso disso.Existe uma maneira simples para truncar o decimais eu não preciso?Eu sei que eu posso usar o left() função e converter para decimal.Existem outras formas?

Foi útil?

Solução

select round(123.456, 2, 1)

Outras dicas

ROUND ( 123.456 , 2 , 1 )

Quando o terceiro parâmetro != 0 ele trunca, ao invés de incluir rodadas

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Sintaxe

ROUND ( numeric_expression , comprimento [função ] )

Argumentos

  • numeric_expression É uma expressão do numérico exato ou aproximado de dados numéricos tipo de categoria, exceto para o tipo de dados bit.

  • comprimento É a precisão para que numeric_expression a ser arredondado.o comprimento deve ser uma expressão do tipo tinyint, smallint ou int.Quando o comprimento é um número positivo, numeric_expression é arredondado para o número de posições decimais especificada pelo seu comprimento.Quando o comprimento é um número negativo, numeric_expression é arredondado no lado esquerdo do ponto decimal, conforme especificado pelo comprimento.

  • função É o tipo de operação a realizar.função deve ser tinyint, smallint ou int.Quando a função é omitido ou tem um valor de 0 (predefinição), numeric_expression é arredondado.Quando um valor diferente de 0 for especificado, numeric_expression é truncado.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

Aqui está a maneira que eu era capaz de truncar e não redondas:

select 100.0019-(100.0019%.001)

retorna 100.0010

E o seu exemplo:

select 123.456-(123.456%.001)

retorna 123.450

Agora, se você quiser se livrar de final zero, simplesmente lançá-lo:

select cast((123.456-(123.456%.001)) as decimal (18,2))

retorna 123.45

Na verdade, qualquer que seja o terceiro parâmetro é 0 ou 1 ou 2, ele não volta do seu valor.

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

Rodada tem um parâmetro opcional

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

Outro truncar sem arredondamento solução e exemplo.

    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

Você quer o decimal ou não?

Se não, use

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

Se você fizer isso com 0, em seguida, fazer uma rodada:

select round(@value,2)

Isto irá remover a parte decimal de qualquer número de

SELECT ROUND(@val,0,1)

Eu sei que isto é muito tarde, mas eu não vejo isso como uma resposta e têm vindo a utilizar este truque há anos.

Simplesmente subtrair .005 do seu valor e uso Rodada(@nm,2).

O seu exemplo:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

retorna 123.45

Ele irá automaticamente ajustar o arredondamento para o valor correto que você está procurando.

A propósito, você está recriando o programa a partir do filme de Espaço de Escritório?

Por favor, tente usar esse código para a conversão de 3 valores decimais após um ponto em 2 casas decimais:

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

select @val

A saída é 123.46

Eu acho que você quer apenas o valor decimal, neste caso, você pode usar o seguinte:

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

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

Outra forma é ODBC TRUNCATE função:

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

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

LiveDemo

Saída:

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

Comentário:

Eu recomendo usar o built-in ROUND função com parâmetro 3ª definido para 1.

Eu sei que essa pergunta é bem velha, mas ninguém usou sub-cadeias a rodada.Isso como vantagem a capacidade de ronda muito longo números (limite de sua cadeia de caracteres no SQL server que é geralmente 8000 caracteres):

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

Mod(x,1) é a maneira mais fácil que eu acho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top