es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Número de PHP menos el mismo número no es igual a 0.

Estoy intentando restar 119.7 de 119.7 usando PHP pero el resultado no es el esperado (-1.4210854715202E-14), el resultado esperado es 0.

  1. Doc1 RestToPay = 171
  2. Doc2 RestToPay = 119.7

Aquí está mi código:

$TotalAmountToPay = 290.7;
foreach($Docs as $Doc){
    $RestToPay = $Doc['RestToPay'];
    if($TotalAmountToPay <= 0){
        break;
    }
    $TotalAmountToPay = $TotalAmountToPay - $RestToPay;
    if($TotalAmountToPay >= 0){
        echo "OK: ".$TotalAmountToPay;
    }else{
        echo "Hecho: ".$TotalAmountToPay;
    }
}

Salida que he obtenido:
– OK: 119.7
– Hecho: -1.4210854715202E-14

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema se debe a la forma en que se representan los números de punto flotante en binario, lo cual puede ocasionar pequeñas imprecisiones al realizar operaciones. Para solucionarlo, puedes redondear el resultado utilizando la función round() o comparar el resultado con un valor de tolerancia para tener en cuenta las pequeñas diferencias. En este caso, round($TotalAmountToPay, 2) o la comparación con 0.01 como tolerancia debería dar como resultado esperado 0. A continuación se muestra un código actualizado con el enfoque de tolerancia:

    $TotalAmountToPay = 290.7;
    foreach($Docs as $Doc){
        $RestToPay = $Doc['RestToPay'];
        if($TotalAmountToPay <= 0){
            break;
        }
        $TotalAmountToPay = $TotalAmountToPay - $RestToPay;
        if(abs($TotalAmountToPay) < 0.01){
            echo "OK: ".$TotalAmountToPay;
        }else{
            echo "Done: ".$TotalAmountToPay;
        }
    }
    

    Esto debería generar la siguiente salida:

    • OK: 119.7
    • OK: 0

Comments are closed.