0

Tengo el siguiente código:

<?php

for ($i = 0; $i < 10; $i += 0.1) {
    echo '<hr>' . $i . '</hr>';
    $suma = 0;
    $suma += $i;
    if ($i == 9.9)
        echo 'La suma total es: ' . $suma;
}

?>

Cuando ejecuto el programa, no se refleja el valor de la variable $suma.

¿Por qué ocurre este error y cómo puedo arreglarlo?

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
Eduardo Sebastian
  • 4,908
  • 7
  • 30
  • 70
  • Cual es el error? Podrias ser mas claro – Ivan Botero Sep 18 '17 at 19:46
  • No se observa ningun error [ejecutando el codigo](https://tio.run/##TYxBCsMgEEX3c4q/EGwIWLNMdZIL9BJSEhRalCRdlZ7dqu2is/jw/zxe8ilnlLNz8olojdtJBNZGBDvU7FmrocOLKrTcfIS0fpskFEQoIe25VtP@Yn8@HBj6v/ZcyO8Q1iIHM0Y1dj/b1aFhRzzcHct@QXPXzdCbaJ5y/gA "PHP – Try It Online") – Ivan Botero Sep 18 '17 at 19:47
  • @IvanBotero, lee la pregunta y ejecuta el codigo que el provee. No se porque los puntos negativos a la pregunta, verdaderamente no muestra el valor que imprime por `echo` – Einer Sep 18 '17 at 19:48
  • Que no me muestra la variable $suma, es el error, supongo que fui claro – Eduardo Sebastian Sep 18 '17 at 19:48
  • El problema esta en la condición del if. Si pruebas a poner `if ($i > 9.9)` alli si imprime la suma. – Alvarez Sep 18 '17 at 20:01
  • 1
    Esta **casi** hay que cerrarla como **duplicada**, ¿ no ? [¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?](https://es.stackoverflow.com/q/197/19610) – Trauma Sep 18 '17 at 21:06
  • @Trauma comparto contigo respecto a la casi duplicidad. o sea el problema es ese. – gbianchi Sep 19 '17 at 02:24
  • @EduardoSebastian nunca compruebes números en coma flotante por equidad, los números en coma flotante son aproximaciones no valores exáctos. – PaperBirdMaster Sep 19 '17 at 06:52

3 Answers3

3

Nunca me habia encontrado con este tipo de escenario e investigando di con esta respuesta en stackoverflow en ingles donde dice que cuando haces alguna computación con el tipo float con uno de los valores(en este caso el valor de la variable $i), aunque parezcan idénticos internamente no lo son. Por lo que normalmente nunca comparas valores de coma flotante para igualdad, asi que necesitas usar una diferencia aceptable más pequeña.(negrias son citas del post)

Adaptando esa respuesta a tu pregunta pude hacerlo funcionar de esta manera:

<?php
for($i=0;$i<10;$i+=0.1) 
{
    echo '<hr>' . $i . '</hr>';

    if(abs(($i-(9.9))/(9.9)) < 0.00001)
    {
        echo 'La suma total es: ' . $i;
    }

}
?>

Admito que tu pregunta me sorprendio mucho. Llegue a creer que era un error del lenguaje.

Einer
  • 20,190
  • 2
  • 14
  • 36
0

Es un problema con el formato de alguna forma tienes que ponerlos igual. Aquí otra forma de darle formato. Un ejemplo :

<?php
$suma = 0;
for($i=  0;$i<10;$i= $i + 0.1) {

    $valor =  9.9;
    echo "$i == $valor <br>";
    $i = number_format($i,1,".",",");
        $valor = number_format($valor,1,".",",");
    if( $i == $valor) {
        echo 'La suma total es: papapapa...' ;
}
}
Alex Diaz
  • 119
  • 9
-1

Porque siempre estás iniciando la variable en 0 en cada iteración, sacala del foreach

 <?php
$suma = 0;
for($i=0;$i<10;$i+=0.1) {
    echo '<hr>' . $i . '</hr>';
    $suma += $i;
    if($i == 9.9) echo 'La suma total es: ' . $suma;
}

?>
Sr1871
  • 4,737
  • 1
  • 8
  • 16