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
Não consigo obter um número bonito arredondado ao centésimo mais próximo. 12.57 em vez de 12.57000000008).

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.20000000008
88.54000000007
86.36000000008

Sou Eu a colocar algo de errado na minha função de matemática?

Nota: Isto está no nó.js

Author: Justin Cloud, 2013-05-11

3 answers

Tenta isolar o número até ao centésimo lugar. ie [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

A trabalhar violino.

 1
Author: Jay Harris, 2013-08-03 02:05:13

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:

 2
Author: Ben McCormick, 2013-05-11 02:05:32
Se só precisa de apoiar navegadores modernos,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"
 1
Author: LandonSchropp, 2013-05-11 07:04:24