2012-03-15 10 views
6

En Windows 7 Python 3.2, lo siguiente:Math.ceil Posible() fallo

print(int(math.ceil(24/10))) 

me da '3' como se esperaba.

En Windows Server con Active Python 2.5, me da '2'.

¿Cuál es el problema aquí y cómo puedo solucionarlo?

Aquí está mi código original:

number_of_pages = int(math.ceil(number_of_rows/number_of_rows_per_page)) 

Gracias,

Barry

+0

Supongo que esto no es un error en Python, sino en un nivel inferior. – bigblind

Respuesta

16

Python 2.x utiliza truncar disivion, por lo que la respuesta a 24/10 es 2. El ceil de 2 es igual: 2

La solución es convertir uno de los operandos en flotante:

print(int(math.ceil(24.0/10))) 
+0

+1. Muéstremelo ... – Jon

+0

¿Esto causa mucha confusión? – Baz

+4

Si no necesita el comportamiento de división int para, p. Ej. compatibilidad con versiones anteriores, puede 'partir de __future__ división de importación' y tener la semántica razonable cuando' 1/2 = 0.5'. – 9000

1

Pruebe esto: print(int(math.ceil(24/10.0))), devolverá el valor correcto. Como se ha señalado, en Python 2.5 la expresión 24/10 se evalúa como 2, porque está realizando una división entera.

3

Una lectura rápida de los lenguajes de programación se encuentra ese entero dividido por número entero vuelve

un entero

  • pitón 2
  • java
  • C++
  • c
  • C#
  • rubí
  • ocaml
  • f #
  • ir
  • FORTRAN

punto flotante (asterisco significa que hay sintaxis alternativa para devolver un número entero)

  • pitón 3 *
  • java guión
  • php
  • Perl *
  • dardo *
  • VBScript
  • vb.neta *
  • Erlang *
  • Pascal *

algo más

  • clojure (devuelve una relación si no puede devolver un entero)

elección de Python para el cambio la semántica del operador de división era quite controversial en ese momento. Devolver un número entero a menudo sorprende a los programadores principiantes y matemáticos, sin embargo, los programadores experimentados a menudo sienten lo mismo cuando descubren que dividir dos enteros puede devolver el punto flotante.

+0

Me gusta esta idea de usar ratios para almacenar flotadores. ¿Ha sido considerado para Python? – Baz

+0

Hay 'Fraction' en el módulo' fractions'. Pero casi nunca lo necesitas. También hay 'Decimal' en el módulo' decimal' que actúa como un punto flotante más amigable. Estos tipos de datos son intrínsecamente más lentos que los enteros y el punto flotante. También son un poco difíciles de manejar. Use según sea necesario. –