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:
- 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.
- Se a parte fracionária for menor que 0.5, o valor inteiro arredondado será igual à parte inteira.
- 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