Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

toFixed arredonda o valor

Como posso usar o toFixed sem que ele arredonde o valor? O exemplo abaixo está arredondando para 56.99:

console.log(56.987.toFixed(2));

Como alternativa, eu usei o Math.floor, multiplicando por 100 e depois dividindo, mas ficou com cara de gambiarra isso:

Math.floor(person[i].querySelector('.value').textContent * 100) / 100;

Existe uma forma melhor no JS, sem que fique com cheiro de gambiarra? Talvez o toFixed mesmo, porém de outro jeito?

Obrigado.

5 respostas

Olá, Phillip!

Para isso que você quer não é a função toFixed.

O que você quer é a função toPrecision.

Ou seja, o seu código vai ficar:

console.log(56.987.toPrecision(2));

Bons estudos!

Olá Arthur.

Você chegou a testar antes esse toPrecision? Funcionou?

Pois aqui o código console.log(56.987.toPrecision(2)); arredonda também, retornando 57. Mesmo ajustando ele para toPrecision(4) continua arredondando, mas para 56.99.

O que eu precisaria é que ele apenas "sumisse" com o 7, retornando assim 56.98, mas não é o que acontece nesse toPrecision.

solução!

Olá, Phillip!

Não havia testado não. Confesso que fiz correndo lendo só a documentação da função, perdão por isso.

Na documentação de toFixed informa que o número é arredondado, mas na documentação de toPrecision, não é dito nada nos exemplos.

Lendo novamente, confirma o teste feito por você:

A string representing a Number object in fixed-point or exponential notation rounded to precision significant digits.

Não tem jeito então. Todas as funções de precisão da Math arredondam, pelo visto.

Sua solução não é uma gambiarra não. Pesquisando na Internet é, inclusive, algo que muitos sugerem para fazer. Eu não vejo o menor problema de você utilizar seu código.

Só criaria uma função para ser aproveitado em mais de um lugar. Ficaria algo assim:

function casasDecimais(num, precisao) {
    var casas = Math.pow(10, precisao);
    return Math.floor(num * casas) / casas;
};

O que acha?

Você não vai achar bonito, mas a forma mais precisa seria essa:

function toFixed(num, fixed) {
    var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
    return num.toString().match(re)[0];
}

Lembrando que isso retorna uma string, converta para Number se necessário.

Legal Arthur, acho que vou usar dessa forma ai mesmo, e obrigado pela atenção.

Rodrigo, com regex não havia pensado, obrigado por citar essa alternativa, vou guardar pois talvez em uma outra ocasião eu precise.

[]'s