Cálculo de números con decimales en javascript

charl1

Buenas,

He tenido la necesidad de hacer cálculos de decimales en javascript con el problema que conlleva. Para los lectores que no lo sepan, poner en consola del navegador (chrome, por ejemplo) 0.1+0.2 y veréis que grata sorpresa.

El caso es que para solucionar este problema de representación de decimales por parte del lenguaje me he creado una función que recibe n parámetros, y luego hago uso de Math.round() .

Una solución que funciona y creo que es elegante.

Dicho esto, quería preguntaros si habéis cálculado alguna vez números con decimales en javascript y que solución habéis aplicado.

PD: Cuando he trabajado con números grandes (+16 dígitos) he usado la librería Bignumber.js.

eXtreM3

No me había parado a pensarlo, ya que las veces que he calculado con decimales en js siempre eran mayores que 1, y este problema se omite nativamente por alguna razón.

El caso es que haciendo unos cálculos rápidos en la consola, aprecio que únicamente ocurre cuando es 0 y tiene 1 decimal, con 2 decimales lo hace bien:

de hecho, acotando aún más observo que sólo ocurre cuando el número es menor o igual que 0.1

Para solucionarlo puedes usar el toFixed, pasándole como parámetro el número de decimales que quieras (en este caso, el que más decimales tenga de tu suma)

1 respuesta
Merkury

#1 ParseFloat()

Nada mas que decir

2 respuestas
eXtreM3

#3

Kiroushi

#1 El problema de representación no es por parte del lenguaje, si no por la computación en sí. Tampoco es por números menores qué o mayores qué. Sólo tiene que ver con números que en representación binaria siguen patrones de repetición.

0.1 en binario viene a ser lo mismo que representar 1/3 en decimal; necesitas una cantidad infinita de cifras para representarlo con exactitud, con lo que al final toca redondear.

http://en.wikipedia.org/wiki/IEEE_floating_point

1 respuesta
charl1

#2 Gracias, no lo conocía.
#3 Pruébalo antes de afirmar. Veo que #2 ya te lo ha hecho saber.
#5 Me equivoqué al expresarlo, pero quería referirme a eso.

1 respuesta
Kiroushi

#6 Lo mejor que puedes hacer es trabajar con enteros y después aplicar los decimales representativos redondeados.

Rubo18

Anda que no me dió por culo esto en su momento xD.

La solución que yo aplico es multiplicar los valores por 10n, calcular, y dividir por 10n. Elegancia ninguna, pero que le vamos a hacer xD.

Usuarios habituales

  • Rubo18
  • Kiroushi
  • charl1
  • eXtreM3
  • Merkury