Published on

September 22, 2020

Compreendendo as técnicas de conversão de decimal para inteiro no SQL Server

Ao trabalhar com valores decimais e inteiros no SQL Server, é importante compreender as várias técnicas disponíveis para converter números decimais em inteiros. Neste artigo, exploraremos diferentes métodos e discutiremos quando usar cada um deles em suas atribuições.

A função T-SQL Round

A função round do T-SQL é comumente usada para converter valores decimais em inteiros. Ela recebe uma expressão numérica como entrada e arredonda para o número inteiro mais próximo. Aqui está um exemplo:

SELECT ROUND(3.14, 0) AS ValorArredondado;

Isso retornará o valor 3, pois arredonda para baixo o valor decimal 3.14 para o inteiro mais próximo.

É importante observar que a função round sempre arredonda para cima quando a parte fracionária do valor decimal é 0.5. Isso pode introduzir um viés em direção a valores inteiros arredondados mais altos. Por exemplo, a soma dos valores decimais pode ser 8.0, mas a soma dos valores inteiros arredondados pode ser 10.

As funções Ceiling e Floor

Além da função round, o SQL Server também fornece as funções ceiling e floor para converter valores decimais em inteiros.

A função ceiling retorna o menor inteiro maior ou igual ao valor decimal, enquanto a função floor retorna o maior inteiro menor ou igual ao valor decimal.

Aqui está um exemplo:

SELECT CEILING(3.14) AS ValorTeto, FLOOR(3.14) AS ValorPiso;

Isso retornará os valores 4 e 3, respectivamente.

Vale ressaltar que quando o valor decimal possui uma parte inteira, tanto as funções ceiling quanto floor retornarão o mesmo valor, que é a parte inteira do número decimal.

A Função Escalar Personalizada Banker’s Rounding

Em alguns casos, você pode precisar de uma maneira mais precisa de arredondar valores decimais para inteiros. O SQL Server não fornece uma função embutida para arredondamento de banqueiro, mas você pode criar uma função escalar personalizada para implementar esse método de arredondamento.

O arredondamento de banqueiro segue um conjunto específico de regras:

  1. Se a parte inteira do valor decimal for par e a parte fracionária for exatamente 0.5, o valor inteiro arredondado será igual à parte inteira.
  2. Se a parte fracionária for menor que 0.5, o valor inteiro arredondado será igual à parte inteira.
  3. Se nenhum dos critérios acima for atendido, o valor inteiro arredondado será igual à parte inteira mais 1.

Aqui está um exemplo de uma função escalar personalizada para arredondamento de banqueiro:

CREATE FUNCTION dbo.BankersRound (@number decimal(19, 4)) 
RETURNS int
AS
BEGIN
  DECLARE @integerpart int, @fractionalpart decimal(19, 4), @bankersround int;
 
  SET @integerpart = CONVERT(int, @number);
  SET @fractionalpart = @number - @integerpart;
 
  SELECT @bankersround = CASE
     WHEN @integerpart % 2 = 0 AND @fractionalpart = 0.5000 THEN @integerpart
     WHEN @fractionalpart < 0.5000 THEN @integerpart
     ELSE @integerpart + 1
  END;
 
  RETURN @bankersround;
END;

Você pode então usar essa função para arredondar valores decimais para inteiros:

SELECT dbo.BankersRound(3.14) AS ValorArredondado;

Isso retornará o valor 3, pois segue as regras de arredondamento de banqueiro.

Comparando as Funções Round, Ceiling, Floor e BankersRound

Agora que exploramos as diferentes técnicas para converter valores decimais em inteiros, vamos compará-las para entender quando usar cada uma.

Aqui está um script que compara as funções round, ceiling, floor e bankersround:

DECLARE @valor_decimal decimal(19, 4);
 
-- Comparação antes e depois de 0.5
SET @valor_decimal = 0.49;
SELECT 
 @valor_decimal AS ValorDecimal,
 ROUND(@valor_decimal, 0) AS ValorArredondado,
 CEILING(@valor_decimal) AS ValorTeto,
 FLOOR(@valor_decimal) AS ValorPiso,
 dbo.BankersRound(@valor_decimal) AS ValorArredondadoBanker;
 
SET @valor_decimal = 0.50;
SELECT 
 @valor_decimal AS ValorDecimal,
 ROUND(@valor_decimal, 0) AS ValorArredondado,
 CEILING(@valor_decimal) AS ValorTeto,
 FLOOR(@valor_decimal) AS ValorPiso,
 dbo.BankersRound(@valor_decimal) AS ValorArredondadoBanker;
 
SET @valor_decimal = 0.51;
SELECT 
 @valor_decimal AS ValorDecimal,
 ROUND(@valor_decimal, 0) AS ValorArredondado,
 CEILING(@valor_decimal) AS ValorTeto,
 FLOOR(@valor_decimal) AS ValorPiso,
 dbo.BankersRound(@valor_decimal) AS ValorArredondadoBanker;

Este script compara os resultados de cada função para diferentes valores decimais. Você pode modificá-lo para atender às suas necessidades específicas.

Algumas diferenças importantes a serem observadas:

  • A função round retorna valores decimais em um tipo de dados decimal(19, 4). Se você precisar dos valores inteiros convertidos em um formato int, pode usar a função convert.
  • A função round às vezes arredonda para cima mais do que a função bankersround, o que pode resultar em resultados menos precisos.
  • As funções ceiling e floor são úteis quando você deseja excluir centavos de preços ou precisa de um primeiro rascunho de preços competitivos para o dólar mais próximo.
  • A função bankersround segue um método de arredondamento mais preciso e pode ser usada quando a precisão é crucial.

Lembre-se de considerar os requisitos específicos do seu projeto ao escolher a técnica de conversão apropriada.

Ao compreender as diferentes técnicas para converter valores decimais em inteiros no SQL Server, você pode escolher com confiança o método que melhor atenda às suas necessidades e garanta resultados precisos.

Artigo Atualizado em: 2023-09-20

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.