ponto flutuante - Lidando com a precisão de float em Javascript
Eu tenho uma grande quantidade de valores numéricos y em javascript. Eu quero agrupá-los arredondando para baixo para o múltiplo mais próximo de x e converter o resultado para uma string.
Como faço para contornar a irritante precisão de ponto flutuante?
Por exemplo:
0.2 + 0.4 = 0.6000000000000001
Duas coisas que eu tentei:
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
e :
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
Resposta #1
Deste post: Como lidar com a precisão de números de ponto flutuante em JavaScript?
Você tem algumas opções:
- Use um tipo de dado especial para decimais, como decimal.js
- Formate seu resultado para algum número fixo de dígitos significativos, assim:
(Math.floor(y/x) * x).toFixed(2)- Converta todos os seus números em inteiros
Resposta #2
Você poderia fazer algo assim:
> +(Math.floor(y/x)*x).toFixed(15);
1.2
Editar: Seria melhor usar big.js.
big.js
Uma biblioteca pequena, rápida e fácil de usar para aritmética decimal de precisão arbitrária.
>> bigX = new Big(x)
>> bigY = new Big(y)
>> bigY.div(bigX).round().times(bigX).toNumber() // => 1.2
