Arredondamento de valores no SQL Server

Vejam mais dicas de SQL Server 2012, SQL Server 2014, SQL Server 2016 e etc…

O Arredondamento pode ser mal interpretado se os tipos de dados subjacentes e as Arredondafunções de arredondamento não forem compreendidos. Dependendo do tipo de dados (inteiro, flutuante, decimal etc.), o valor arredondado pode ser diferente. Além disso, dependendo da função de arredondamento do SQL Server (ROUND (), CEILING (), FLOOR ()) usada no cálculo, os valores também podem ser diferentes. Como tal, é importante descobrir os requisitos de arredondamento do usuário e depois converter esses requisitos no comando T-SQL apropriado. (fonte)

Definição:

  • ROUND – Arredonda um valor positivo ou negativo para um comprimento específico e aceita três valores:
    • Valor para arredondar
      • Número positivo ou negativo
      • Esse tipo de dado pode ser um int (minúsculo, pequeno, grande), decimal, numérico, monetário ou pequeno
    • Precisão ao arredondar
      • Número positivo arredonda o lado direito da vírgula decimal
      • Arredondamentos de número negativo no lado esquerdo do ponto decimal
    • O truncamento do valor a arredondar ocorre quando esse valor não é 0 ou não está incluído
  • CEILING – Avalia o valor no lado direito do decimal e retorna o menor número inteiro maior que ou igual à expressão numérica especificada e aceita um valor:
    • Valor para arredondar
  • FLOOR – Avalia o valor no lado direito do decimal e retorna o maior número inteiro menor ou igual à expressão numérica especificada e aceita um valor:
    • Valor para arredondar

Vamos percorrer cada função com alguns tipos de dados diferentes para ver os resultados.

Exemplos ROUND, CEILING e FLOOR do SQL Server para tipos de dados inteiros

Exemplo 1a – Neste primeiro exemplo, vejamos o arredondamento de um número inteiro positivo, pois o valor de precisão 1 produz todas as três funções de arredondamento que retornam o mesmo valor. Neste exemplo, estamos usando uma variável com as funções e confira o resultado comentado à direita da função.

DECLARE @value int 
SET @value = 6 

SELECT ROUND (@value, 1) -- 6 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT CEILING (@value) -- 6 - Menor valor inteiro 
SELECT FLOOR (@value) -- 6 - Maior valor inteiro

Exemplo 1b – Como as funções CEILING AND FLOOR não possuem valores opcionais, vamos testar algumas opções com a função ROUND. Neste exemplo, vamos ver os impactos de um número negativo como a precisão e também a especificação de posições adicionais que excedem o valor a arredondar. Confira esses resultados com o resultado comentado à direita da função.

DECLARE @value int 
SET @value = 6 

SELECT ROUND (@value, 1) -- 6 - Nenhum arredondamento sem dígitos à direita da vírgula decimal 
SELECT ROUND (@value, -1) -- 10 - Arredondando com dígitos à esquerda do ponto decimal 
SELECT ROUND (@value, 2) -- 6 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (@value, -2) -- 0 - Número insuficiente de dígitos 
SELECT ROUND (@value, 3) -- 6 - Sem arredondamento, sem dígitos, à direita da vírgula decimal 
SELECT ROUND (@value, -3) -- 0 - Número insuficiente de dígitos

Exemplo 1c – Vamos expandir os dígitos neste exemplo com a função ROUND e ver os impactos com o resultado comentado à direita da função.

SELECT ROUND (444, 1)  -- 444 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (444, -1) -- 440 - Arredondamento para baixo 
SELECT ROUND (444, 2)  -- 444 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (444, -2) -- 400 - Arredondamento para baixo 
SELECT ROUND (444, 3)  -- 444 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (444, -3) -- 0 - Número insuficiente de dígitos 
SELECT ROUND (444, 4)  -- 444 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (444, -4) -- 0 - Número insuficiente de dígitos 

SELECT ROUND (555, 1 ) -- 555 - Sem arredondamento, sem dígitos, à direita da vírgula decimal 
SELECT ROUND (555, -1) -- 560 - Arredondamento
SELECT ROUND (555, 2)  -- 555 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (555, -2) -- 600 - Arredondando para cima 
SELECT ROUND (555, 3)  -- 555 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (555, -3) -- 1000 - Arredondando para cima 
SELECT ROUND (555, 4)  -- 555 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (555, -4) -- 0 - Número insuficiente de dígitos 

SELECT ROUND (666, 1)  -- 666 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (666, -1) -- 670 - Arredondando 
SELECT ROUND (666, 2)  -- 666 - Sem arredondamento, sem dígitos, à direita da vírgula decimal 
SELECT ROUND (666, -2) -- 700 - Arredondando para cima
SELECT ROUND (666, 3)  -- 666 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (666, -3) -- 1000 - Arredondando para cima 
SELECT ROUND (666, 4)  -- 666 - Nenhum arredondamento sem dígitos à direita do ponto decimal 
SELECT ROUND (666, -4) -- 0 - Número insuficiente de dígitos

Exemplo 1d – Vamos arredondar um número inteiro negativo e ver os impactos com o resultado comentado à direita da função.

SELECT ROUND (-444, -1) -- -440 - Arredondamento para baixo 
SELECT ROUND (-444, -2) -- -400 - Arredondamento para baixo 

SELECT ROUND (-555, -1) -- -560 - Arredondamento 
SELECT ROUND (-555, -2) -- -600 - Arredondando 

SELECT ROUND (-666, -1) -- -670 - Arredondando 
SELECT ROUND (-666, -2) -- -700 - Arredondando

Exemplo 1e – Em nosso último exemplo desta seção, não se deixe enganar por seus tipos de dados e valores reais. Neste exemplo, o parâmetro @value é declarado como INT, mas o valor passado se parece mais com um decimal. Sob essas circunstâncias, vamos ver como os valores são avaliados.

DECLARE @value int 
SET @value = 16.999999 

SELECT ROUND (@value, 1)  -- 16 - Nenhum arredondamento sem dígitos à direita da casa decimal, ou seja, int 
SELECT ROUND (@value, -1) -- 20 - Arredondar 
SELECT CEILING (@value)   -- 16 - Menor valor inteiro 
SELECT FLOOR (@value)     -- 16 - Maior valor inteiro 
SELECT @value             -- 16 - Mostra como o @value é avaliado com base no tipo de dados int

Exemplos ROUND, CEILING e FLOOR do SQL Server para tipos de dados decimais, numéricos e flutuantes

Exemplo 2a – Com um tipo de dados decimal e a função ROUND com vários parâmetros de comprimento (ou seja, 1, 2 ou 3), produz valores finais diferentes em nosso exemplo. O 5 no segundo dígito à direita do ponto decimal é significativo quando o parâmetro length é 1 ao arredondar o valor. Além disso, com o tipo de dados decimal, as funções CEILING e FLOOR levam em consideração as casas decimais para valores diferentes.

DECLARE @value decimal(10,2) 
SET @value = 11.05 

SELECT ROUND (@value, 1)  -- 11.10 
SELECT ROUND (@value, -1) -- 10.00 

SELECT ROUND (@value, 2)  -- 11.05 
SELECT ROUND (@valor, -2) -- 0,00 

SELECIONAR REDONDO (@valor, 3)  -- 11,05 
SELECIONAR REDONDO (@valor, -3) -- 0,00 

SELECIONAR TETO (@valor) -- 12
SELECIONAR PISO (@valor) -- 11 
GO

Exemplo 2b – Aqui está um exemplo rápido do uso do tipo de dados numéricos com a função ROUND. Isso segue muito do mesmo comportamento que o tipo de dados decimal.

DECLARE @value numeric(10,10) 
SET @value = .5432167890 

SELECT ROUND (@value, 1)  -- 0.5000000000 
SELECT ROUND (@value, 2)  -- 0.5400000000 
SELECT ROUND (@value, 3)  -- 0.5430000000 
SELECT ROUND (@value, 4)  -- 0.5432000000 
SELECT ROUND (@value, 5)  -- 0.5432200000 
SELECT ROUND (@value, 6)  -- 0.5432170000 
SELECT ROUND (@value, 7)  -- 0.5432168000 
SELECT ROUND (@value, 8)  -- 0.5432167900 
SELECT ROUND (@value, 9)  -- 0.5432167890 
SELECT ROUND (@value, 10) -- 0.5432167890 
SELECT CEILING (@value)   -- 1 
SELECT FLOOR (@value)     -- 0

Exemplo 2c – No exemplo final, com um tipo de dados flutuante, é possível ver o mesmo tipo de comportamento dos casos decimais e numéricos acima, com as funções ROUND, CEILING e FLOOR.

DECLARE @value float (10) 
SET @value = .1234567890

SELECT ROUND (@value, 1) -- 0.1 
SELECT ROUND (@value, 2) -- 0.12 
SELECT ROUND (@value, 3) -- 0.123 
SELECT ROUND (@value, 4) -- 0.1235 
SELECT ROUND (@value, 5) -- 0.12346 
SELECT ROUND (@value, 6) -- 0.123457 
SELECT ROUND (@value, 7) -- 0.1234568 
SELECT ROUND (@value, 8) -- 0.12345679 
SELECT ROUND (@value, 9) -- 0.123456791 
SELECT ROUND (@value, 10) -- 0.123456791 
SELECT CEILING (@value) -- 1 
SELECT FLOOR (@value) -- 0

Os valores de arredondamento podem causar confusão com vários tipos de dados; portanto, certifique-se de entender os requisitos do usuário e traduza-os para os tipos de dados e funções de arredondamento corretos.


Vejam também:

Funcões e Procedures auxiliares no SQL SERVER

Arredondamento com Intervalo

SQL Server Arredondamento

Alex Souza

14 comentários em “Arredondamento de valores no SQL Server”

  1. Gostaria de uma ajuda,
    Montei uma query para calcular os dias trabalhados de um determinado funcionário em um veículo, com base na quantidade de viagens feitas pelo colaborador por dia.
    Estou tendo problemas com arredondamentos, em valores como por exemplo 2,91 eu gostaria de arredondar para 3. Teria alguma ideia de como fazer, estou tentando utilizar a função Round mas não consegui chegar ao valor desejado em todos os resultados, quando coloco Round(coluna, 1) ele não arredonda os números para cima.

    SELECT c.nomcolaborador + ‘ – ‘ + CONVERT(varchar, CODMOTORISTA) AS ‘MOTORISTA’,
    ROUND(SUM(TRABALHADO),1) AS ‘DIAS_BT’,
    SUM(TRABALHADO) ‘NO ROUND’,
    ‘BT’ + CONVERT(VARCHAR, VEICULO) AS ‘VEICULO’
    FROM #DIA_MOTORISTA
    INNER JOIN COLABORADOR C ON C.CODCOLABORADOR = CODMOTORISTA
    GROUP BY CODMOTORISTA, VEICULO, c.nomcolaborador
    ORDER BY C.NOMCOLABORADOR, CODMOTORISTA, VEICULO

  2. Boa tarde,

    Declare @Valor Float
    Declare @Valor1 Float

    Set @Valor = 11.255
    Set @Valor1 = 71.255

    Select Round(@Valor,2) -> resultado=11.26
    Select Round(@Valor1,2) -> resultado=71.25

    Alguém me consegue explicar porque o “Select Round(@Valor1,2)” tem resultado=71.25 e não 71.26?

    Obrigado

  3. até metade (x/2) arredonda-se para baixo. acima disso, arredonda-se para cima. no exemplo dado, tem-se como digito de referencia de arredondamento o segundo 5 (1/2). dessa forma, ele zera – arredonda para baixo – e primeiro digito seguinte não sofre alteração. por isso o resultado desse calculo é 71.25 e 71.26 como você imaginava.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s