Foros del Web » Programando para Internet » Javascript »

Error de suma desconcertante

Estas en el tema de Error de suma desconcertante en el foro de Javascript en Foros del Web. Hola, me estoy volviendo loco.. sumo 9.7 + 1.1 y javascript me da 10.7999999 lo he porbado inclusive en calculadores hechas con javascript y lo ...
  #1 (permalink)  
Antiguo 26/04/2005, 14:23
 
Fecha de Ingreso: junio-2003
Mensajes: 9
Antigüedad: 20 años, 8 meses
Puntos: 0
Error de suma desconcertante

Hola, me estoy volviendo loco.. sumo 9.7 + 1.1 y javascript me da 10.7999999
lo he porbado inclusive en calculadores hechas con javascript y lo mismo...

En un script sumo 9.7 mas 0 (cero) y me 9.699999999
tube que sacar el script de mi pagina porque no me suma correctamente..

Si alguien sabe que puede suceder, desde ya muy agradecido!!
  #2 (permalink)  
Antiguo 26/04/2005, 18:45
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 4 meses
Puntos: 34
Como estas seteando dichos numeros? intentaste poniendole a cada valor un parseInt?

PD: parseInt es parseInt(valor,decimales) si mal no recuerdo.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #3 (permalink)  
Antiguo 27/04/2005, 05:53
 
Fecha de Ingreso: junio-2003
Mensajes: 9
Antigüedad: 20 años, 8 meses
Puntos: 0
si seteo decimales, 9.70 + 1.10 me da 10.79 si no los sete me da 10.7999999 lo raro es que no lo hace con cualquier cifra.. solo en unas determinadas como este ejemplo..
  #4 (permalink)  
Antiguo 27/04/2005, 07:11
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 4 meses
Puntos: 34
Si, me ha pasado, por eso te recomendaba el parseInt (no recuerdo si lo solucione con eso, pero estoy casi seguro)...poné el código de lo que estas haciendo por favor.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 27/04/2005, 08:25
 
Fecha de Ingreso: junio-2003
Mensajes: 9
Antigüedad: 20 años, 8 meses
Puntos: 0
<script lenguaje=Javascript>
var x = 9.7;
var y = 1.1;
document.write(eval("x + y") + "<br>");
</script>

Aca escribi un pequeño codigo donde da el error, pero si extraigo los datos de un formulario es lo mismo, aunque lo pase por parseFloat(x) o (y)

Gracias por tu tiempo!
  #6 (permalink)  
Antiguo 28/04/2005, 07:18
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 4 meses
Puntos: 34
Que locura!!!...intente varias cosas, y como decis, con esos valores pasa eso!.
La verdad no busque siquiera en google, pero lo que probe no funciono (hasta cambiandoles los . por , aún poniendo el tipo del parseInt en decimal, binario o lo que fuera hace lo mismo)...
Si lo solucionas, sería de gran alivio;)
Y si alguin lo sabe, o soluciona, que lo comparta!
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #7 (permalink)  
Antiguo 28/04/2005, 08:48
 
Fecha de Ingreso: junio-2003
Mensajes: 9
Antigüedad: 20 años, 8 meses
Puntos: 0
Ya esta... la solucion es media extraña pero funciona.. no se si es un bug del javascript, si es asi me gustaria avisarles a los desarrolladores.

multiplico los operandos por 100 y luego dividor por 100 el resultado y asi anda, ej:

var resultado = (9.7 * 100) + (1.1 * 100);

document.write(resultado / 100); y muestra 10.8 que es el numero correcto.

No me preguntes como se me ocurrio, probando de todo.
  #8 (permalink)  
Antiguo 28/04/2005, 11:19
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 4 meses
Puntos: 34
Es una locura, pero si funciona será para tener en cuenta ;)
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #9 (permalink)  
Antiguo 28/04/2005, 17:13
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 1 mes
Puntos: 6
Jajajaja, qué cosas. Pasará porque, en matemáticas, es lo mismo 7.99999... que 8.0000, así que a lo mejor bajo determinadas circunstancias al sistema "le da" por trabajar con 7.9999... Parece un error de diseño, no sé si imprevisto o a posta, de javascript.
  #10 (permalink)  
Antiguo 28/04/2005, 17:18
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 1 mes
Puntos: 6
Otra forma de solucionarlo, a la ya dada y buena de lo de multiplicar por 100, es sumando a un número 0.01 y al otro restándole 0.01 (así "se fuerza" a que dé el resultado bien, pues cuando salen los 9 yo creo que es porque una parte de decimales del resultado no estaba definida en los operandos):

<script lenguaje=Javascript>
var x = 9.71;
var y = 1.09;
document.write(eval("x + y") + "<br>");
</script>
  #11 (permalink)  
Antiguo 29/04/2005, 13:47
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 5 meses
Puntos: 3
Estoy seguro de que es un problema de la forma como internamente calcula el ordenador. Por eso sólo pasa con algunos números. Por la misma razón, no creo que multiplicar por 100 y luego dividir, o sumar y restar 0.1, sea una solución universal.
Lo más seguro es que apliques un redondeo al número de decimales que quieras mostrar en el resultado.
parseInt no sirve porque sólo devuelve enteros, no decimales; además, no redondea, sino que trunca (por ejemplo, parseInt(7.9999)=7).
parseFloat no hace nada respecto al problema, tan solo sirve para convertir un texto en un número.
Math.round sí redondea correctamente, pero sólo devuelve enteros (Math.round(7.9999)=8)

Con lo cual, la solución es pasar tu dato resultado por la función:
Código:
function redondeo(num,numDec)
{
num = num * Math.pow(10,numDec)
num = Math.round(num)
num = num / Math.pow(10,numDec)
return num
}
Para tu ejemplo sería:
Código:
<script "language=Javascript " type="text/javascript">
var x = 9.7;
var y = 1.1;
document.write(redondeo(eval("x + y"), 2) + "<br>");
</script>
__________________
Angel :cool:

Última edición por angsanchez; 29/04/2005 a las 13:53
  #12 (permalink)  
Antiguo 30/06/2005, 08:09
 
Fecha de Ingreso: enero-2002
Mensajes: 1.438
Antigüedad: 22 años, 2 meses
Puntos: 0
Cita:
Iniciado por nicolaspar
Como estas seteando dichos numeros? intentaste poniendole a cada valor un parseInt?

PD: parseInt es parseInt(valor,decimales) si mal no recuerdo.
recuerdas mal

You can use the optional radix argument to convert a binary number string to the decimal (base 10) equivalent.

Code:
document.write(parseInt("110", 2))

Output:
6

You can use the optional radix argument to convert a hexidecimal number string to the decimal (base 10) equivalent.

Code:
document.write(parseInt("0xD9", 16))

Output:
217
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:51.