404 Not Found

404 Not Found


nginx

Números e Math em JavaScript

Em JavaScript, existe apenas um tipo numérico: Number. Seja inteiro ou decimal, tudo é Number. Isso é diferente de linguagens como Java ou C que distinguem entre int, float, e assim por diante. Mais simples, sim — mas vem com algumas armadilhas.

Tipo Number

Em JavaScript, tanto inteiros quanto números de ponto flutuante são do tipo Number — não existe um tipo inteiro separado.

HTML
<script>
let a = 42;        // Isso é um Number
let b = 3.14;      // Isso também é um Number
typeof a;          // "number"
typeof b;          // "number"
</script>

Números também podem ser escritos em vários outros formatos:

HTML
<script>
let hex = 0xFF;       // Hexadecimal, igual a 255
let octal = 0o10;     // Octal, igual a 8
let binary = 0b1010;  // Binário, igual a 10
let big = 1e6;        // Notação científica, igual a 1000000
</script>

NaN e Infinity

NaN significa "Not a Number" (Não é um Número), mas é do tipo Number — uma das escolhas de design mais irônicas do JavaScript.

HTML
<script>
typeof NaN;          // "number"  ← Isso mesmo, é realmente um número
NaN === NaN;         // false     ← Não é nem igual a si mesmo!
Number.isNaN(NaN);   // true      ← Use este método para verificar NaN
</script>

Quando NaN aparece? Quando você tenta fazer matemática com algo que não é um número:

HTML
<script>
parseInt('abc');    // NaN
'olá' * 5;         // NaN
Math.sqrt(-1);     // NaN
</script>

Infinity representa infinito positivo e aparece ao dividir por zero:

HTML
<script>
1 / 0;             // Infinity
-1 / 0;            // -Infinity
typeof Infinity;   // "number"
</script>
💡 Para verificar se um valor é NaN, nunca use === — use Number.isNaN(). Como NaN === NaN é false, esta é uma armadilha que pegou incontáveis desenvolvedores.

Precisão de Ponto Flutuante

Esta é a peculiaridade mais famosa do JavaScript: 0.1 + 0.2 !== 0.3.

HTML
<script>
0.1 + 0.2;          // 0.30000000000000004
0.1 + 0.2 === 0.3;  // false
</script>

O motivo está relacionado a como os computadores armazenam números de ponto flutuante em binário. O valor 0.1 é uma fração repetitiva em binário, levando à perda de precisão durante o armazenamento. Isso não é exclusivo do JavaScript — todas as linguagens que usam o padrão IEEE 754 têm esse problema.

A solução: use toFixed() para formatação, ou aumente a escala antes de calcular:

HTML
<script>
(0.1 + 0.2).toFixed(2);   // "0.30"
(0.1 * 100 + 0.2 * 100) / 100;  // 0.3
</script>

Exemplo: Demonstração de Problemas de Precisão

HTML
<!DOCTYPE html>
<html lang="pt-br">
<body>
  <h2>Problemas de Precisão de Ponto Flutuante</h2>
  <p id="output"></p>
  <script>
    let html = '';
    html += '0.1 + 0.2 = ' + (0.1 + 0.2) + '<br>';
    html += '0.1 + 0.2 === 0.3 ? ' + (0.1 + 0.2 === 0.3) + '<br><br>';
    html += '<strong>Solução 1: toFixed</strong><br>';
    html += '(0.1 + 0.2).toFixed(2) = ' + (0.1 + 0.2).toFixed(2) + '<br><br>';
    html += '<strong>Solução 2: Aumentar escala e depois diminuir</strong><br>';
    html += '(0.1*100 + 0.2*100)/100 = ' + ((0.1 * 100 + 0.2 * 100) / 100) + '<br><br>';

    html += '<strong>Relacionado a NaN:</strong><br>';
    html += 'parseInt("abc") = ' + parseInt('abc') + '<br>';
    html += 'NaN === NaN ? ' + (NaN === NaN) + '<br>';
    html += 'Number.isNaN(NaN) ? ' + Number.isNaN(NaN) + '<br><br>';

    html += '<strong>Relacionado a Infinity:</strong><br>';
    html += '1 / 0 = ' + (1 / 0) + '<br>';
    html += 'typeof Infinity = ' + typeof Infinity;

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ Experimente

O Objeto Math

Math é a utilidade matemática embutida do JavaScript. Sem necessidade de instanciação — basta chamar seus métodos diretamente:

Método/Propriedade Propósito Exemplo
Math.round() Arredondar para o inteiro mais próximo Math.round(4.6)5
Math.floor() Arredondar para baixo Math.floor(4.9)4
Math.ceil() Arredondar para cima Math.ceil(4.1)5
Math.random() Número aleatório 0–1 Math.random()0.3721...
Math.max() Valor máximo Math.max(1,5,3)5
Math.min() Valor mínimo Math.min(1,5,3)1
Math.PI Pi 3.141592653589793
Math.abs() Valor absoluto Math.abs(-7)7
Math.pow() Exponenciação Math.pow(2,3)8
Math.sqrt() Raiz quadrada Math.sqrt(16)4

Exemplo: Métodos Comuns do Math

HTML
<!DOCTYPE html>
<html lang="pt-br">
<body>
  <h2>Métodos do Objeto Math</h2>
  <p id="output"></p>
  <script>
    let html = '';
    html += 'Math.round(4.6) = ' + Math.round(4.6) + '<br>';
    html += 'Math.round(4.4) = ' + Math.round(4.4) + '<br>';
    html += 'Math.floor(4.9) = ' + Math.floor(4.9) + '<br>';
    html += 'Math.ceil(4.1) = ' + Math.ceil(4.1) + '<br>';
    html += 'Math.abs(-7) = ' + Math.abs(-7) + '<br>';
    html += 'Math.pow(2, 10) = ' + Math.pow(2, 10) + '<br>';
    html += 'Math.sqrt(144) = ' + Math.sqrt(144) + '<br>';
    html += 'Math.max(1, 5, 3) = ' + Math.max(1, 5, 3) + '<br>';
    html += 'Math.min(1, 5, 3) = ' + Math.min(1, 5, 3) + '<br>';
    html += 'Math.PI = ' + Math.PI + '<br>';

    let radius = 5;
    let area = Math.PI * Math.pow(radius, 2);
    html += `Área do círculo com raio ${radius} = ${area.toFixed(2)}`;

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ Experimente
💡 Math.round(-1.5) retorna -1, não -2. O comportamento de arredondamento no limite negativo pode não corresponder à sua intenção — tenha isso em mente.

toFixed() — Formatando Decimais

toFixed(n) formata um número para n casas decimais e retorna uma string:

HTML
<script>
let price = 9.9;
price.toFixed(2);    // "9.90"  ← Nota: retorna uma string
+(9.9).toFixed(2);   // 9.9     ← Use + para converter de volta para número
</script>
⚠️ toFixed retorna uma string! Se você precisa fazer mais cálculos com ele, lembre-se de converter de volta para número.

toString() — Conversão de Base

O método de número toString(radix) converte um número para uma string na base especificada:

HTML
<script>
(255).toString(16);   // "ff"  hexadecimal
(255).toString(2);    // "11111111"  binário
(255).toString(8);    // "377"  octal
(100).toString();     // "100"  decimal (padrão)
</script>

Exemplo: Conversão de Base

HTML
<!DOCTYPE html>
<html lang="pt-br">
<body>
  <h2>Conversão de Base</h2>
  <p id="output"></p>
  <script>
    let num = 255;
    let html = `Número ${num} em diferentes bases:<br><br>`;
    html += `Decimal: ${num.toString()}<br>`;
    html += `Binário: ${num.toString(2)}<br>`;
    html += `Octal: ${num.toString(8)}<br>`;
    html += `Hexadecimal: ${num.toString(16)}<br><br>`;

    let price = 19.9;
    html += `Preço formatado: R$${price.toFixed(2)}<br>`;
    html += `Tipo de retorno do toFixed: ${typeof price.toFixed(2)}<br>`;

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ Experimente

Math.random() — Gerando Números Aleatórios

Math.random() retorna um número de ponto flutuante aleatório entre 0 (inclusivo) e 1 (exclusivo). Na prática, você frequentemente precisa de um número inteiro aleatório dentro de um intervalo específico:

HTML
<script>
// Gerar um inteiro aleatório entre min e max (inclusivo)
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
</script>

Exemplo: Demonstração de Números Aleatórios

HTML
<!DOCTYPE html>
<html lang="pt-br">
<body>
  <h2>Gerador de Números Aleatórios</h2>
  <button onclick="rollDice()">Rolar Dado</button>
  <button onclick="pickLotto()">Escolher Números (1-35)</button>
  <p id="output"></p>
  <script>
    function getRandomInt(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    function rollDice() {
      let dice = getRandomInt(1, 6);
      let dots = '';
      for (let i = 0; i < dice; i++) {
        dots += ' ⚀';
      }
      document.getElementById('output').innerHTML =
        `Você tirou <strong>${dice}</strong>${dots}`;
    }

    function pickLotto() {
      let numbers = [];
      while (numbers.length < 5) {
        let n = getRandomInt(1, 35);
        if (!numbers.includes(n)) {
          numbers.push(n);
        }
      }
      numbers.sort((a, b) => a - b);
      document.getElementById('output').innerHTML =
        `Seus números da sorte: <strong>${numbers.join(' ')}</strong>`;
    }
  </script>
</body>
</html>
▶ Experimente
💡 Math.random() produz números pseudo-aleatórios e não é adequado para fins criptográficos. Para aleatoriedade criptograficamente segura, use crypto.getRandomValues().


📖 Resumo

  1. JavaScript tem apenas um tipo Number — tanto inteiros quanto decimais são Number
  2. NaN não é igual a nenhum valor (incluindo si mesmo); use Number.isNaN() para detectá-lo
  3. 0.1 + 0.2 !== 0.3 é um problema de precisão; corrija com toFixed() ou aumentando e diminuindo a escala
  4. Math.floor arredonda para baixo, Math.ceil para cima, Math.round para o inteiro mais próximo
  5. Fórmula para inteiro aleatório: Math.floor(Math.random() * (max - min + 1)) + min
  6. toFixed() retorna uma string — converta de volta para número se precisar fazer mais cálculos

❓ Perguntas Frequentes

P:Quanto são Math.round(2.5) e Math.round(-2.5) respectivamente? R:Math.round(2.5) é 3, e Math.round(-2.5) é -2. Quando o decimal é exatamente .5, JavaScript arredonda em direção ao infinito positivo — então tanto números positivos quanto negativos arredondam para cima (mais próximos de 0).

P:Como verifico se um valor é um número válido e finito? R:Use Number.isFinite(valor). Ele exclui NaN, Infinity e -Infinity, e também rejeita tipos não numéricos. O isFinite() global também funciona, mas não verifica o tipo (faz coerção primeiro).

P:Qual a diferença entre parseInt e Number()? R:parseInt('12abc') retorna 12 — ele analisa da esquerda para a direita até não poder continuar. Number('12abc') retorna NaN — a string inteira deve ser um número válido. Use parseInt para análise tolerante e Number() para conversão estrita.

📝 Atividades

  1. Escreva um programa que recebe o raio de um círculo como entrada, calcula sua área e circunferência, e exibe os resultados arredondados para 2 casas decimais.
  2. Escreva um jogo de adivinhação de números: o programa gera aleatoriamente um inteiro entre 1 e 100, o usuário insere palpites, e o programa responde com "Muito alto" ou "Muito baixo" até encontrar a resposta correta.
  3. Escreva um conversor de base: insira um número decimal e exiba simultaneamente seus equivalentes binário, octal e hexadecimal.
100%