Javascript (node.js) Math.floor returning long decimal values [duplicate]
esta pergunta já tem uma resposta aqui:
- A matemática de vírgula flutuante está partida? 27 Respostas
var example = {
user : "John",
dollars: 12.57
};
setInterval( function() {
example.dollars += (parseInt(Math.floor(Math.random()*2000 + 500)) / 100);
console.log(example.dollars);
}, 1000);
Continuo a ter valores como:
15.2000000000888.54000000007
86.36000000008
Sou Eu a colocar algo de errado na minha função de matemática?
Nota: Isto está no nó.js
3 answers
[86.36]000000008
var example = {
user : "John",
dollars: 12.57
};
setInterval(function() {
var s, final;
example.dollars += (parseInt(Math.floor(Math.random() * 2000 + 500)) / 100);
s = example.dollars + .005 + '',
final = s.substring(0, s.indexOf('.') + 3);
console.log(final);
}, 1000);
Tudo o que estamos a fazer é remover tudo depois da centésima casa decimal.Para isso, temos de encontrar a casa decimal para encontrarmos o centésimo valor decimal por palavra. Primeiro temos que converter o número em uma string, + ''
ou você pode usar a função toString()
. então usamos indexOf('.')
para encontrar a posição decimal e finalmente contamos três lugares acima. isso vai dar-te o número para o ... centésimo lugar, sem os longos valores decimais.
Exemplos:
entrada: 12.57000000008
Saída: 12.57
entrada: 15.20000000008
saída: 15.20
Os números de Javascript são números de vírgula flutuante. Não devem ser utilizadas para operações decimais de precisão.
Por exemplo, pode introduzir isto numa consola js.1 + .2 //0.30000000000000004
Geralmente você pode contar com a matemática inteira com precisão, e se você precisar de mais controle sobre a precisão decimal, você pode olhar para bibliotecas como Este que lhe permite definir limites de erro nos seus números, ou fazer uma chamada para uma biblioteca externa escrita numa língua com um melhor tratamento de tipos de números.
Mais bibliotecas para a matemática decimal exacta do JS:
toFixed
o método é a melhor escolha. Leva um argumento que representa o número de casas decimais a arredondar e devolve um String
.
example.dollars.toFixed(2); // returns "12.57"