2

Necesito solo coger dos decimales de un numero con el método toFixed(2) y para ello tengo que convertir a parseFloat los números porque sino me falla el método toFixed. El problema es que me dan números erróneos y no se por qué.

var x=0;
var y=0;
var T=127.76;
var c=63.88;
var ci=110.64;

Sin usar parseFloat y toFixed;

var x1=x+ci;//110.64809081046089
var y1=y-c;//-63.882705014737745
var x2=x1+c;//174.53079582519862
var y2=y1+ci;//46.76538579572314

Al usar parseFloat y toFixed el resultado da erroneo;

var x1=x+ci;//110.64809081046089
x1=parseFloat(x1);//110.64809081046089
x1=x1.toFixed(2);//110.65
var y1=y-c;//-63.882705014737745
y1=parseFloat(y1);//-63.882705014737745
y1=y1.toFixed(2);//-63.88

Aquí ya me calcula mal las operaciones

var x2=x1+c;//110.6563.882705014737745 Y DEBERIA DAR 174.53079582519862
x2=parseFloat(x2);
x2=x2.toFixed(2);
var y2=y1+ci;//-63.88 Y DEBERIA DAR 46.76538579572314
y2=parseFloat(y2);
y2=y2.toFixed(2);

No entiendo por qué estos resultados son erróneos.

lois6b
  • 7,419
  • 5
  • 29
  • 50
Andrés
  • 65
  • 3
  • tu pregunta es porque es diferente o como solucionarlo? – JackNavaRow Sep 20 '18 at 11:26
  • A mi parecer la pregunta no es un duplicado de la que se menciona, el problema no es los números flotantes, sino el tipo de datos –  Sep 20 '18 at 14:49

2 Answers2

4

El problema que tienes es que se está liando entre los float y los que el considera que son string.

La solución sería hacerles el parseo a todas las variables al principio

var x=parseFloat(0);
var y=parseFloat(0);
var T=parseFloat(127.76);
var c=parseFloat(63.88);
var ci=parseFloat(110.64);

o hacerselo a todos durante las operaciones

var x2=x1+parseFloat(c);
x2=parseFloat(x2);
x2=x2.toFixed(2);
var y2=y1+parseFloat(ci);
y2=parseFloat(y2);
y2=y2.toFixed(2);
3

Lo que te está pasando es un error bastante frecuente cuando se opera con variables que contienen valores numéricos. Y es que hay que tener muy claro el tipo de contenido con el que estamos trabajando. Este es uno de tus resultados erróneos:

var x2=x1+c;//110.6563.882705014737745 Y DEBERIA DAR 174.53079582519862

Lo que tú esperas es que la variable x2 pase a contener la suma de la variable x1 y la variable c. Y aquí tenemos el problema. La variable c en tu código se está tratando como un string, por lo que en vez de sumar su valor a x1 lo está concatenando, dando como resultado lo que nos pones:

110.6563.882705014737745

Lo que yo haría sería forzar a que c sea también un número haciéndole un parseFloat() y lo mismo con las demás variables que operen en las fórmulas que te estén dando resultados erróneos.

phpMyGuel
  • 14,074
  • 1
  • 20
  • 38