Lo que todo programdor debería saber sobre…

Hace un par de días hablábamos con una compañera sobre NO USAR el tipo de datos float para manejar dinero:

>>> 0.1 + 0.3
0.40000000000000002

A no alarmarse, lo anterior sucede en todos los lenguajes de programación; aunque algunos lo ocultan más que otros. La charla terminó con la recomendación de revisar un sitio web que explica el tema de forma muy consisa:

What Every Programmer Should Know About Floating-Point Arithmetic

Además de explicar cómo funciona el tipo de datos float y cómo solucionar el problema, da machetes para varios lenguajes de programación (C#, Java, JavaScript, PHP y SQL).

Me sorprendió que no haya una para Python, por lo que seguí el mandato del autor del sitio web, fork me on github, y envié mis cambios. update: ya está disponible en el sitio web.

Siguiendo con el título del posts, me puse a buscar otros artículos con el formato: Lo que todo programador debería saber sobre… y encontré estos:

Acerca de Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí algunos libros.
Esta entrada fue publicada en Cosas que leo y etiquetada , , , , , , . Guarda el enlace permanente.
  • http://twitter.com/alejolp alejolp

    Una buena opción para manejar dinero es trabajarlo en centavos con un tipo de datos entero. Sino en Python existe la libreria decimal, que vendria a ser equivalente a BigDecimal de Java. Esa clase es la que se usa para el tipo de datos Currency en Postgres.

  • jjconti

    El sitio explica la alternativa de usar enteros, pero tiene varios inconvenientes.
    Justamente en el machete de Python uso Decimal. Se aceptan patchs,

  • http://twitter.com/alejolp alejolp

    Muy bueno el machete, y parece que ya está live :)

    Por suerte en Python MAX_INT+1 devuelve un long con el valor correcto y no otro numero:

    >>> type(sys.maxint)
    <type 'int'>
    >>> type(sys.maxint+1)
    <type 'long'>

  • Alejandro Russo

    En Haskell esto no pasa :)

    Prelude> 0.1+0.3
    0.4
    Prelude>

  • jjconti

    Traigo un comentario en PyAr:

    Tenés Rational y tenés Float (y Double). En realidad las constantes
    literales no tienen un tipo dado, sino una “type class” (que es algo
    almost but not quite entirely unlike an abstract superclass). En este
    caso 0.1, 0.3 tienen type-class Fractional, i.e. “que se pueden
    representar exactamente como una fracción”. Tanto Float como Rational
    (como Int!) “matchean” Fractional.

    El tipo concreto de esa expresion va a acabar dependiendo de lo que
    necesite el typechecker, o sea, el lugar donde lo evalues. Es decir,
    si haces f (0.1 + 0.3), donde f tiene tipo Float->Float, vas a tener
    un valor no exacto de la suma.

  • Pingback: Lo que todo programador debería saber sobre aritmética de coma flotante « Mbpfernand0's Blog