Manejo de la precisión flotante en Javascript [duplicado]

Resuelto Jeroen Ooms asked hace 12 años • 5 respuestas

Tengo una gran cantidad de valores numéricos yen javascript. Quiero agruparlos redondeándolos al múltiplo más cercano xy convertir el resultado en una cadena.

¿Cómo puedo evitar la molesta precisión del punto flotante?

Por ejemplo:

0.2 + 0.4 = 0.6000000000000001

Dos cosas he probado:

>>> y = 1.23456789 
>>> x = 0.2 
>>> parseInt(Math.round(Math.floor(y/x))) * x; 
1.2000000000000002

y:

>>> y = 1.23456789 
>>> x = 0.2 
>>> y - (y % x)
1.2000000000000002
Jeroen Ooms avatar Jul 28 '12 04:07 Jeroen Ooms
Aceptado

De esta publicación: ¿Cómo lidiar con la precisión de números de punto flotante en JavaScript?

Tienes pocas opciones:

  • Utilice un tipo de datos especial para decimales, como decimal.js
  • Formatee su resultado con un número fijo de dígitos significativos, como este:

(Math.floor(y/x) * x).toFixed(2)

  • Convierte todos tus números a enteros
Rusty Fausak avatar Jul 27 '2012 21:07 Rusty Fausak

Podrías hacer algo como esto :

> +(Math.floor(y/x)*x).toFixed(15);
1.2

Editar: sería mejor usar big.js.

grande.js

Una biblioteca pequeña, rápida y fácil de usar para aritmética decimal de precisión arbitraria.

>> bigX = new Big(x)
>> bigY = new Big(y)
>> bigY.div(bigX).round().times(bigX).toNumber() // => 1.2
philipvr avatar Jul 27 '2012 21:07 philipvr