Foros del Web » Programando para Internet » PHP »

Problemas al restar decimales PHP

Estas en el tema de Problemas al restar decimales PHP en el foro de PHP en Foros del Web. Hola amigos tengo un problema al restar decimales, si resto mediante un for nunca llega a 0 y el otro que si el valor es ...
  #1 (permalink)  
Antiguo 21/01/2011, 20:10
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 5 meses
Puntos: 51
Exclamación Problemas al restar decimales PHP

Hola amigos tengo un problema al restar decimales, si resto mediante un for nunca llega a 0 y el otro que si el valor es igual a 0. 10 me da esto

1.04083408559E-17

la restas las hago de esta forma

Código PHP:
$cant=0.10;
for(
$i=0$i<45;$i++){
    if(
$cant >= 0.01 ){
        
$cant=$cant-0.01;
        echo 
'index'.$i.': valor'.$cant.'--<br />';
        
    }else{
        echo 
'Temp:'.$cant.'--<br />';
        break;    
    }

las respuestas según las cantidades son

$cant=0.10; //1.04083408559E-17
$cant=0.09; // 0.01 (deberia ser 0)
$cant=0.20; // 0.01 (deberia ser 0)

Sabéis a que se debe este problema y si se puede restar de forma segura
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #2 (permalink)  
Antiguo 21/01/2011, 23:05
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problemas al restar decimales PHP

La precision de un numero flotante en PHP es todo, menos precisa

Si el echo del for, lo cambias a:
echo 'index'.$i.': valor - '. number_format($cant, 40) .'<br />';

El resultado es algo como:
Código:
index0: valor - 0.0900000000000000105471187339389871340245
index1: valor - 0.0800000000000000155431223447521915659308
index2: valor - 0.0700000000000000205391259555653959978372
index3: valor - 0.0600000000000000185962356624713720520958
index4: valor - 0.0500000000000000166533453693773481063545
index5: valor - 0.0400000000000000147104550762833241606131
index6: valor - 0.0300000000000000127675647831893002148718
index7: valor - 0.0200000000000000108246744900952762691304
index8: valor - 0.0100000000000000106165076729780594178010
index9: valor - 0.0000000000000000104083408558608425664715
Pero... usando solo dos posiciones decimales:
echo 'index'.$i.': valor - '. number_format($cant, 2) .'<br />';

Código:
index0: valor - 0.09
index1: valor - 0.08
index2: valor - 0.07
index3: valor - 0.06
index4: valor - 0.05
index5: valor - 0.04
index6: valor - 0.03
index7: valor - 0.02
index8: valor - 0.01
index9: valor - 0.00
El resultado sigue siendo el mismo, solo cambia la representacion.

Sera cuestion de hacer pruebas para saber si realmente se tienen 16 posiciones decimales de precision o menos... de acuerdo a esas pruebas, idear una forma de hacer la comparacion eludiendo el resto de digitos.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 22/01/2011, 05:57
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 5 meses
Puntos: 51
Respuesta: Problemas al restar decimales PHP

Muchas gracias por la respuesta voy a ver que puedo hacer con estos datos
XD
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #4 (permalink)  
Antiguo 22/01/2011, 06:07
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 5 meses
Puntos: 51
Respuesta: Problemas al restar decimales PHP

Muy Bien gracias a lo que me has dicho la solución queda de esta forma mas o menos XD para quien le interese

Código PHP:
$cant=1.90;
$cantnumber_format($cant2);
for(
$i=0$i<245;$i++){
    if(
$cant >= 0.01 ){
        
$cant=number_format($cant-0.01,2);
        echo 
'index'.$i.': valor - '.$cant.'- <br />';
        
    }else{
        echo 
'Temp: '.$cant.' <br />';
        break;    
    }

He hecho pruebas con los valores en conflicto y no habido problemas de momento XD

Gracias de nuevo Triby
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #5 (permalink)  
Antiguo 02/06/2011, 08:44
Avatar de marielahh77  
Fecha de Ingreso: febrero-2011
Ubicación: La Paz, Bolivia
Mensajes: 1
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Problemas al restar decimales PHP

gracias por la ayuda si es mejor redondear los resultados

Etiquetas: restar
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:44.