Por que Float é Perigoso para Valores Monetários?
Olá meus Unicórnios! 🦄✨
Você já notou que quando usa float, para armazenar dinheiro, os cálculos ficam malucos?
Mas como assim maluco?
Você concorda que 0,1 + 0,2 é 0,3? O computador não concorda!
Vamos executar o cálculo em javascript:
Veja o resultado:
0.30000000000000004
Porque não retornou 0.3?
Tudo no computador é armazenado, lá nas profundezas, em binário.
Para os números flutuantes (float), eles são armazenados utilizando o padrão IEEE 754, que divide o número em partes.
Vamos utilizar um site, que converte float e binário e vice versa, para vermos na prática:
Ao converter o 0,1 em binário, gera uma representação infinita (Igual quando dividimos 1/3):
Você notou que a parte "11001100" se repete? Esta repetição é infinita que gera a falha no cálculo.
Agora vamos voltar pra Float o Binário Gerado?
Ou seja, não temos exatamente 0,1!
Mas o que isto afeta? É só 0,1!
Imagine que você tem um site, onde vários vendedores vendem seus produtos, e cada venda gera uma comissão de R$ 9,1 para o site.
Este mesmo site, realiza aproximadamente 100 milhões de vendas mensais.
Então, vamos ver quando será gerado em comissões?
= 100.000.000 * 9,1 = 910.000.000
Agora vamos simular que tivemos as 100 milhões e vendas e vamos somando o R$ 9,1 em Js?
let acumulador = 0;
let valorPorTransacao = 9.1;
let transacoes = 100000000;
for(let i = 0; i < transacoes; i++)
{
acumulador += valorPorTransacao;
}
let esperado = transacoes * valorPorTransacao;
let diferenca = acumulador - esperado;
console.log("Valor Acumulado: " + acumulador.toPrecision(17));
console.log("Valor Esperado: " + esperado.toPrecision(17));
console.log("Erro Acumulado: " + diferenca.toPrecision(17));
Nosso retorno será:
Valor Acumulado: 910000001.55677783
Valor Esperado: 910000000.00000000
Erro Acumulado: 1.5567778348922729
Ou seja, você perdeu R$ 1,5567.
É pouco, mas é um erro!
Pense nisto em longa escala, os prejuízos podem ser enormes e você nem notar.
Por hoje é só, meus unicórnios! 🦄✨
Que a magia do arco-íris continue brilhando em suas vidas! Até mais! 🌈🌟