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:

Float (IEEE754 Single precision 32-bit)
Online binary converter. Supports all types of variables, including single and double precision IEEE754 numbers

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! 🌈🌟