Foros del Web » Programando para Internet » PHP »

Error en Calculo PHP

Estas en el tema de Error en Calculo PHP en el foro de PHP en Foros del Web. Buenas, Estoy desarrollando un sistema en PHP y vengo teniendo un problema hace mucho tiempo que intente buscarle distintas soluciones pero siempre termina ocurriendo. Paso ...
  #1 (permalink)  
Antiguo 09/04/2010, 08:11
 
Fecha de Ingreso: agosto-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Error en Calculo PHP

Buenas,

Estoy desarrollando un sistema en PHP y vengo teniendo un problema hace mucho tiempo que intente buscarle distintas soluciones pero siempre termina ocurriendo. Paso a comentarles:

De un formulario HTML el usuario selecciona importes y los envia mediante el form hacia otra pagina. Al recibirlos tengo una funcion para calcular el saldo:

Código PHP:

$saldoPositivo 
0;
$saldoNegativo 0;
        
foreach(
$_vecImportesPend as $p){
    if(
$p["importe"]>=0)
       
$saldoPositivo $saldoPositivo $p["importe"]; 
    else  
           
$saldoNegativo $saldoNegativo $p["importe"];
}
        
$saldo $saldoPositivo $saldoNegativo;
        
return 
floatval($saldo); 
Cuando se da que coincide el saldo Positivo con el saldo Negativo me tira como saldo el siguiente valor: -5.6843418860808E-14 o similares, o sea se produce un overflow en la operacion.

Busque por muchos lados pero no encontre solucion, ya les digo probe de muchas formas en realizar la operacion pero siempre ocurre lo mismo.

Bueno, espero que me puedan ayudar y desde ya muchas gracias !!

Saludos.
  #2 (permalink)  
Antiguo 09/04/2010, 08:14
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Error en Calculo PHP

hace un var_dump a $_vecImportesPend y pega aqui el resultado
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 09/04/2010, 09:54
 
Fecha de Ingreso: septiembre-2004
Mensajes: 324
Antigüedad: 20 años, 2 meses
Puntos: 13
Respuesta: Error en Calculo PHP

Cita:
Iniciado por fede585 Ver Mensaje
Buenas,

Estoy desarrollando un sistema en PHP y vengo teniendo un problema hace mucho tiempo que intente buscarle distintas soluciones pero siempre termina ocurriendo. Paso a comentarles:

De un formulario HTML el usuario selecciona importes y los envia mediante el form hacia otra pagina. Al recibirlos tengo una funcion para calcular el saldo:

Código PHP:

$saldoPositivo 
0;
$saldoNegativo 0;
        
foreach(
$_vecImportesPend as $p){
    if(
$p["importe"]>=0)
       
$saldoPositivo $saldoPositivo $p["importe"]; 
    else  
           
$saldoNegativo $saldoNegativo $p["importe"];
}
        
$saldo $saldoPositivo $saldoNegativo;
        
return 
floatval($saldo); 
Cuando se da que coincide el saldo Positivo con el saldo Negativo me tira como saldo el siguiente valor: -5.6843418860808E-14 o similares, o sea se produce un overflow en la operacion.

Busque por muchos lados pero no encontre solucion, ya les digo probe de muchas formas en realizar la operacion pero siempre ocurre lo mismo.

Bueno, espero que me puedan ayudar y desde ya muchas gracias !!

Saludos.
Prueba asi...
Código PHP:
$saldo = (int)$saldoPositivo + (int)$saldoNegativo
  #4 (permalink)  
Antiguo 12/04/2010, 11:39
 
Fecha de Ingreso: agosto-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Error en Calculo PHP

Hidek1, el var_dump del vector da lo siguiente:

Código PHP:
array(11) { [0]=>  array(3) { ["nrocom"]=>  int(10059) ["tipcom"]=>  int(200) ["importe"]=>  float(-16.4) } [1]=>  array(3) { ["nrocom"]=>  int(10060) ["tipcom"]=>  int(200) ["importe"]=>  float(-9.84) } [2]=>  array(3) { ["nrocom"]=>  int(10061) ["tipcom"]=>  int(200) ["importe"]=>  float(-8.05) } [3]=>  array(3) { ["nrocom"]=>  int(10063) ["tipcom"]=>  int(200) ["importe"]=>  float(-34.91) } [4]=>  array(3) { ["nrocom"]=>  int(10064) ["tipcom"]=>  int(200) ["importe"]=>  float(-61.42) } [5]=>  array(3) { ["nrocom"]=>  int(10066) ["tipcom"]=>  int(200) ["importe"]=>  float(-7.96) } [6]=>  array(3) { ["nrocom"]=>  int(10070) ["tipcom"]=>  int(200) ["importe"]=>  float(-61.02) } [7]=>  array(3) { ["nrocom"]=>  int(10135) ["tipcom"]=>  int(200) ["importe"]=>  float(-46.91) } [8]=>  array(3) { ["nrocom"]=>  int(10141) ["tipcom"]=>  int(200) ["importe"]=>  float(-5.71) } [9]=>  array(3) { ["nrocom"]=>  int(10142) ["tipcom"]=>  int(200) ["importe"]=>  float(-44.73) } [10]=>  array(3) { ["nrocom"]=>  int(138294) ["tipcom"]=>  int(100) ["importe"]=>  string(6"296.95" } } 

karliky, los valores son float y ya habia probado ese simil "casteo" y no funciono....

Gracias igual a ambos por sus respuestas !
  #5 (permalink)  
Antiguo 12/04/2010, 11:50
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Error en Calculo PHP

Puede ser que en algún momento las operaciones necesiten más precisión de la que aporta el tipo float. Si te fijas el número que dices te devuelve al sumar valores iguales pero opuestos, tiende a cero. Es muy muy pequeño.

Puedes solucionarlo redondeando a dos decimales, y te dará 0.

return round($saldo,2);
__________________
Perros y cachorros
  #6 (permalink)  
Antiguo 12/04/2010, 11:58
 
Fecha de Ingreso: agosto-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Error en Calculo PHP

LoveMeNot, si esa es una posible solucion pero me extraña que pase esto porque tampoco utilizo numeros tan grandes.

Lo que note cuando hice el var_dump del vector que el ultimo valor venia como un -> string(6) "296.95" -> lo que me llevo a pensar que casteando el valor como float podria solucionarse, pero sin embargo lo hice, volvi a tirar el var_dump, salia como float pero sin embargo tenia el mismo error en el calculo...
  #7 (permalink)  
Antiguo 12/04/2010, 12:07
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Error en Calculo PHP

Del manual de php:

http://www.php.net/manual/es/language.types.float.php

Cita:
Warning
Precisión del punto flotante

Es bastante común que algunas fracciones decimales simples como 0.1 o 0.7 no puedan ser convertidas a su representación binaria interna sin perder un poco de precisión. Esto puede llevar a resultados confusos: por ejemplo, floor((0.1+0.7)*10) usualmente devolverá 7 en lugar del esperado 8 ya que el resultado de la representación interna es en realidad algo como 7.9.

Esto se debe a que es imposible expresar de forma exacta algunas fracciones en notación decimal con un número finito de dígitos. Por ejemplo, 1/3 en forma decimal se convierte en 0.3.

Así que nunca confíe en resultados de números flotantes hasta el último dígito, y nunca compare números de punto flotante para conocer si son equivalentes. Si realmente necesita una mejor precisión, las funciones matemáticas de precisión arbitraria y las funciones gmp están disponibles.
__________________
Perros y cachorros
  #8 (permalink)  
Antiguo 12/04/2010, 12:12
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años, 7 meses
Puntos: 16
Respuesta: Error en Calculo PHP

Cita:
Iniciado por LoveMeNot Ver Mensaje
No sabia que estaba en español el manual jaja hace un tiempo andaba pero despues lo sacaron y de ahi siempre lo lei en ingles, que bueno...
  #9 (permalink)  
Antiguo 12/04/2010, 12:19
 
Fecha de Ingreso: agosto-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Error en Calculo PHP

Bueno, es bueno saberlo la verdad no habia leido ese fragmento y mira que estuve buscando por la pagina de PHP...

Gracias a ambos por haberme ayudado, voy a dejar por ahora el round que me paso LoveMeNot.

Gracias.

Etiquetas: calculo
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:46.