Hoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número 'quebrados' ou Float. Esse problema em específico já caiu em uma entrevista de emprego que eu fiz.
Me passaram um caso de teste e infelizmente eu não lembro exatamente como foi, mas eu vou mostrar como podemos resolver isso de uma forma interessante.
Primeiramente vou mostrar qual o problema que nós temos com precisão de números float, tanto em Node quanto em outras linguagens. Vamos supor que temos a seguinte situação:
const num1 = 0.1
const num2 = 0.2
const num3 = num1 + num2
Ao darmos o console.log no num3 reparem o número que nós temos:
Essa sujeira atrapalha tudo que vamos fazer. Lembrando que essa sujeira vem da conversão para binário e esses números acabam se atrapalhando.
Qual a solução para isso? Quando temos números monetários, como preço ou algo nesse sentido, nós tentamos tratar esses números como inteiro, por exemplo, no caso de um banco que fizemos o sistema, eles precisavam de cinco casas decimais de precisão, então nós multiplicávamos isso por 100000 e em seguida dividíamos
const precisao = 100
const num1 = parseInt(0.1 * precisao)
const num2 = parseInt(0.2 * precisao)
A regra é multiplicar pelo número de casas decimais que queremos e converter em seguida para inteiro, depois fazemos a conta com inteiros, já que ele não tem esse problema. Depois disso, quando formos retornar o valor, nós dividimos pela precisão:
const num3 = ((num1 + num2) / precisao).toFixed(2)
Obviamente, depois precisamos fazer mais um tratamento porque ele volta a ficar sujo, então precisamos fixar, por exemplo, com 2 zeros depois da vírgula.
Quando fazemos essa conversão para inteiro, não temos mais esse problema de precisão. Um exemplo para ficar mais claro: vamos supor que você quer armazenar uma camisa que custa R\$10.99, ao invés de armazenar 10.99, armazena 1099 centavos, com um centavo não é divisível fica muito mais simples de fazermos essa conta.
Se você passar por esse problema, agora já sabe como resolver. :)
Confira o video:
Curta o
DevPleno no Facebook,
inscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!