Pesquisa de site

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

Artigos relacionados