How can I force division to be floating point? Division keeps rounding down to 0?
Solution 1
In Python 2, division of two ints produces an int. In Python 3, it produces a float. We can get the new behaviour by importing from __future__
.
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
Solution 2
You can cast to float by doing c = a / float(b)
. If the numerator or denominator is a float, then the result will be also.
A caveat: as commenters have pointed out, this won't work if b
might be something other than an integer or floating-point number (or a string representing one). If you might be dealing with other types (such as complex numbers) you'll need to either check for those or use a different method.
Solution 3
How can I force division to be floating point in Python?
I have two integer values a and b, but I need their ratio in floating point. I know that a < b and I want to calculate a/b, so if I use integer division I'll always get 0 with a remainder of a.
How can I force c to be a floating point number in Python in the following?
c = a / b
What is really being asked here is:
"How do I force true division such that a / b
will return a fraction?"
Upgrade to Python 3
In Python 3, to get true division, you simply do a / b
.
>>> 1/2
0.5
Floor division, the classic division behavior for integers, is now a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
However, you may be stuck using Python 2, or you may be writing code that must work in both 2 and 3.
If Using Python 2
In Python 2, it's not so simple. Some ways of dealing with classic Python 2 division are better and more robust than others.
Recommendation for Python 2
You can get Python 3 division behavior in any given module with the following import at the top:
from __future__ import division
which then applies Python 3 style division to the entire module. It also works in a python shell at any given point. In Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
This is really the best solution as it ensures the code in your module is more forward compatible with Python 3.
Other Options for Python 2
If you don't want to apply this to the entire module, you're limited to a few workarounds. The most popular is to coerce one of the operands to a float. One robust solution is a / (b * 1.0)
. In a fresh Python shell:
>>> 1/(2 * 1.0)
0.5
Also robust is truediv
from the operator
module operator.truediv(a, b)
, but this is likely slower because it's a function call:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Not Recommended for Python 2
Commonly seen is a / float(b)
. This will raise a TypeError if b is a complex number. Since division with complex numbers is defined, it makes sense to me to not have division fail when passed a complex number for the divisor.
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
It doesn't make much sense to me to purposefully make your code more brittle.
You can also run Python with the -Qnew
flag, but this has the downside of executing all modules with the new Python 3 behavior, and some of your modules may expect classic division, so I don't recommend this except for testing. But to demonstrate:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
Solution 4
c = a / (b * 1.0)
Solution 5
In Python 3.x, the single slash (/
) always means true (non-truncating) division. (The //
operator is used for truncating division.) In Python 2.x (2.2 and above), you can get this same behavior by putting a
from __future__ import division
at the top of your module.
Comments
-
Nathan Fellman almost 2 years
I have two integer values
a
andb
, but I need their ratio in floating point. I know thata < b
and I want to calculatea / b
, so if I use integer division I'll always get 0 with a remainder ofa
.How can I force
c
to be a floating point number in Python 2 in the following?c = a / b
-
hobs over 12 yearsBut you might later be tempted to do
1.0 + 1/3
orfloat(c) + a/b
orfloat(a/b)
and you'll be disappointed with the answer. Better to use python 3+ or import the__future__.division
module, (see accepted answer), to always get the answer you expect. The existing division rules create insidious, hard-to-trace math error. -
Mark Dickinson over 8 yearsThat's not ideal, though, since it doesn't work in the case where
a
is an int andb
is a float. A better solution along the same lines is to dofrom operator import truediv
and then usetruediv(a, b)
. -
JoeCondron over 8 yearsYeah you're right. I was assuming both integers as this is the only time when the division ops differ but you really want a general solution. I didn't actually know you could import the operator or that it doesn't work at all for float divisors. Answer edited.
-
gsbabil over 8 years@JoeCondron Did you try
python -c 'a=10; b=3.0; print a/b'
? -
JoeCondron over 8 yearsI didn't have to because it obviously works in this scenario. However, what if
a
and 'b', e.g., are the outputs of an integer-value function? E.g.,a = len(list1), b = len(list2)
. -
gsbabil over 8 years@JoeCondron: good point. I just updated the answer to include
float(..)
. I think multiplying by1.0
, as @Pinochle suggested below, could also be useful. -
stackoverflowuser2010 over 7 yearsAnd how are you going to apply this approach if the numerator and denominator are both variables?
-
stackoverflowuser2010 over 7 yearsHow are you going to apply this approach if the numerator and denominator are both variables?
-
Alexander over 7 yearsI assume you refer to the first example, if that is so , i would just use
float()
on one of the variables. -
Keir Simmons about 7 yearsBecause it doesn't work when variables are used for abstraction. Almost no meaningful code has values hardcoded like that.
-
TimZaman over 6 yearsThis has little votes because this answer doesn't answer the question, and isn't a general answer at all. In an answer it's also important first to show why this works. It's very simple: if the numerator or denominator is a float, the result will be a float. Usually you don't use python as a plaintext calculator, so you want an answer for variables
a
andb
. -
yannis over 6 yearsNote that
from __future__ import division
must be at the very beginning of the file -
R. Navega over 5 years"1 // 2 = 0", "1 // 2.0 = 0.0" -- interesting little gotcha, even if it's an integer division, if any of the operands is float then the result is a whole number but also float. I was using an integer division to calculate a list index and getting an error because of that.
-
mercury0114 almost 5 yearsAlso the problem is if you want the integer division in one place but the float division in another place of the file...
-
smac89 over 4 yearsFor the longest time, I actually thought
./
was a valid operator in python that allows you to do floating point division. This is why it is good to use white space judiciously, in any programming language -
ShadowRanger over 4 years@mercury0114: Not a problem; you just use
//
when you want floor division, and/
when you want "true" (float
) division. -
xxSithRagexx about 3 yearsThanks for this answer! Was driving me crazy. Why on earth did they choose to do that in Python 2? I've never seen that before.