Tipo de dado number
Números Inteiros
Números inteiros são valores numéricos que não possuem casas decimais.
console.log(100); // 100
No exemplo acima, o número 100 é um exemplo de um número inteiro.
Números Flutuantes
Números flutuantes são valores numéricos que podem possuir casas decimais (pontos flutuantes, na programação).
console.log(3.1415); // 3.1415
Neste exemplo, o número 3.1415 é um exemplo de um número flutuante.
IEEE 754-2008
O padrão IEEE 754-2008 estabelece uma norma para a representação e aritmética de números de ponto flutuante em sistemas computacionais.
Problema
Em operações com números de ponto flutuante, pode ocorrer uma imprecisão devido às representações internas desses valores.
let num1 = 0.7;
let num2 = 0.1;
num1 += num2;
num1 += num2;
num1 += num2;
console.log(num1); // 0.9999999999999999
console.log(Number.isInteger(num1)); // false
No código acima, após uma série de operações, o valor de num1
deveria ser 1, mas devido à imprecisão, ele resulta em 0.9999999999999999
.
Solução
Uma solução para lidar com essa imprecisão é utilizar métodos que arredondam o número para um determinado número de casas decimais.
let num1 = 0.7;
let num2 = 0.1;
num1 += num2;
num1 += num2;
num1 += num2;
num1 = parseFloat(num1.toFixed(2));
// OU
num1 = Number(num1.toFixed(2));
console.log(num1); // 1
console.log(Number.isInteger(num1)); // true
Outra abordagem é multiplicar os números pela quantidade de casas decimais desejadas, realizar a operação e, em seguida, dividir novamente para obter um resultado mais preciso.
let num1 = 0.7;
let num2 = 0.3;
num1 = (num1 * 100 + num2 * 100) / 100;
console.log(num1); // 1
console.log(Number.isInteger(num1)); // true