PHP no sabe sumar

Python — Lunes 17 de Diciembre de 2007, 09:45

Hace rato que quería hacer este post. Más que nada, como referencia, porque luego comento esto y no me acuerdo exactamente estas lineas, entonces me es más fácil apuntar a este post y listo.

Si ejecutamos el siguiente script en PHP, intentando sumar 3 y 058...
<?
$r = 3 + 058;
echo $r."n";
?>
..., el tipo muestra "8".

La realidad es que estamos haciendo algo mal, pero PHP te oculta el error, sigue como si nada, y el programa sigue trabajando con fruta.

"Ningún error debería pasar silenciosamente", dice el Zen de Python. Si ejecutamos esa suma en Python, encontramos que dá un error. A partir de ese error vemos que realmente tenemos un problema en lo que queríamos hacer.

Pero PHP no da error. Contesta el resultado de la suma. Un resultado equivocado. Ergo, PHP no sabe sumar.
gCoop

comentarios

  1. Increíble.

    Escrito por Juanjo — 22 Dic 2007, 10:39

  2. Hay que tener cuidado con lo que se dice tan categoricamente.
    Creo que una frase mejor sería: "PHP no sabe sumar enteros que empiezan con 0", por que seamos sinceros, todo sabemos, y nos es obvio, de que PHP si sabe sumar.
    Capaz esta frase es un poco menos pretenciosa, pero más acertada.

    Escrito por Emiliano — 30 Ene 2008, 05:46

  3. Pero suma es suma así empiece por cero o por cualquier otro número.
    La verdad es que falla, bien a este detalle.
    Puede ser que no sea el caso de una suma de números naturales pero que tal que ese número se le asigne a un carácter y quieras hacer una operación asignada a este carácter se te va a reventar el aplicativo.

    Escrito por Diego — 24 Oct 2008, 08:05

  4. PHP = Para Hacer Paginas
    Si fuese Para Sumar, seria PS, no PHP
    jaja
    :p

    Escrito por J — 28 Ago 2009, 01:27

  5. python tampoco :-)
    Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
    win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 1 + 010
    9
    >>>

    (si,si, sé porque)

    Escrito por claudio canepa — 28 Ago 2009, 02:49

  6. Claudio: En tu ejemplo de Python el número que empieza con cero es un octal válido.

    Es un caso de "ambigüedad a la vista", no de ocultar errores y truncar el número sin avisarle a nadie.

    Ojo, tampoco me gusta lo de tener esa ambigüedad, y como es algo reconocido que se mantiene por compatibilidad, en la evolución del lenguaje (Python 3) ya no se puede escribir octales de esa manera...

    Python 3.0.1+ (r301:69556, Apr 15 2009, 15:59:22)
    >>> 1 + 010
    ...
    SyntaxError: invalid token
    >>> 1 + 0o10
    9

    Slds.

    Escrito por Facundo Batista — 28 Ago 2009, 08:53

  7. >>> 1 + 010
    9

    ¿Porque?
    Gracias por desbrutizarme

    Escrito por Marcos — 28 Ago 2009, 09:06

  8. Marcos: En Python 2, arrancar un número con 0 era la forma de indicar que estaba en octal, por lo que ese 010 (en octal) es un 8 (en decimal), mirá:

    >>> 010
    8

    Esta sintáxis cambió en Python 3, para que "sorprenda menos" (fijate mi ejemplo en el comentario 6).

    Escrito por Facundo Batista — 28 Ago 2009, 09:57

  9. Muchas gracias Facundo.
    Mientras vos escribías tu comentario 6, yo escribía el 7, pensando que era el 6.
    Muchas gracias de nuevo por la aclaración sobre esos octales

    Escrito por Marcos — 28 Ago 2009, 11:35

  10. Estaría bien poner el porque falla ahí PHP como se ha puesto en los ejemplos que lo comentan sobre Python.

    Mi teoría es que interpreta el cero a la izquierda como cadena y al hacer la suma unicamente se queda con el último carácter.

    Saludos

    Escrito por shakaran — 29 Ago 2009, 05:59

  11. Shakaran: Lo que hace PHP ahí es encontrar un número que empieza con 0 y lo interpreta como octal (igual que Python 2), y luego se encuentra que tiene un 8, pero en lugar de dar un error porque es un octal inválido, trunca el número ahí y convierte lo que le quedó, dándote basura como si fuera un dato válido (lo que corresponde es generar un error).

    Escrito por Facundo Batista — 29 Ago 2009, 10:25

  12. Sabe sumar enteros, y tambien en octal :), vos?

    Escrito por Marru — 17 Nov 2009, 15:23

  13. 058 no es octal. El 8 es basura. Pero se declaró internamente como octal, por lo que internamente se convierte a (int).

    var_dump((int)058); da int(5).

    Y 3 + 5 = 8.

    Prueba con echo 3 + 057; te dará 50, porque 057 octal es igual a 47 decimal ;-)

    Raro e imbécil, pero esa es la explicación.

    Escrito por Rodrigo Fuentealba — 08 Dic 2009, 15:57

  14. Rodrigo,

    Sin ánimo de entrar en polémica, ya sabemos la "explicación". De hecho hay un reporte de bug del año 2004 en b.p.n:

    http://bugs.php.net/bug.php?id=29676

    La justificacion? corregirlo implicaría que los scripts que usen números correrían más lentos (mirá el reporte del bug).

    En cualquier otro Lenguaje de Programación decente un número en notación octal con dígitos fuera de rango da un error.

    En Python, Java, C/C++, Ruby escribir "058" da un error de compilación, de interprete o un error numérico.

    En PHP ese error pasa desapercibido.

    Saludos,

    Escrito por Alejandro Santos — 09 Dic 2009, 16:39


Añadir comentario

authimage






Powered by LifeType