Math and Int/Float in Python
If you're transitioning from a language like PHP to Python, such as myself... There is something you need to know about using math.ceil
with integers.
Test case, pagination:
import math
import requests
response = requests.get('http://website.com/api', params={'page': 1})
result = response.json()
result['info'] = {u'num_results': u'182', u'limit': u'100', u'offset': u'0', u'page': u'1'}
Coming from PHP, I would expect the following to work:
num_results = int(result['info']['num_results'])
limit = int(result['info']['limit'])
pages = int(math.ceil(num_results / limit))
print pages # You get a result of '1', not 2 like you should.
The Python way:
num_results = float(result['info']['num_results'])
limit = float(result['info']['limit'])
pages = int(math.ceil(num_results / limit))
print pages # You get a result of '2'
Even though the numbers are technically integers
, you would expect math.ceil
to convert the result into a float
and you are good to go. But, in Python, you must first convert them to floats
in order to get a proper result from math.ceil
. The same thing goes with all int
math operations that will result in a float
:
>>> float(182 / 100) # gives you 1.0
>>> float(182) / float(100) # gives you 1.82
Written by Nathan Lucas
Related protips
1 Response
The problem is not math.ceil
, but rather that in Python 2 division between integers. So if in Python 2 you do: 182 / 100
you actually get 1. In the second snippet ceil
actually gets 1 as argument: it cannot convert the single numbers to floats because it gets the result as argument. You can avoid that (on Python 2) by adding at the top of the file:
from __future__ import division
and you would get what you would expect. This is the default in Python 3: 182 / 100
gives 1.82
.