Python integer division yields float

Go To StackoverFlow.com

175

Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Is this intended? I strongly remember earlier versions returning int/int=int? What should I do, is there a new division operator or must I always cast?

2009-08-15 21:48
by Jonas Byström
Yes, that's the way division works in 3.x - hughdbrown 2009-08-15 22:49
Here's a post by Python's creator talking about how the rounding works, it's orthogonal to your question but I found it interesting: http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.htm - Aaron D 2013-02-28 16:59
@hughdbrown so that means for all python 3 version essentially - Charlie Parker 2017-02-24 22:36
@hughdbrown: yes, PEP is final, meaning both accepted and implemented - Jonas Byström 2017-03-02 09:40


233

Take a look at PEP-238: Changing the Division Operator

The // operator will be available to request floor division unambiguously.

2009-08-15 21:51
by Brandon E Taylor
@JonathanSternberg except for all the code that was written for python 2.0. I feel like the role of / and // should be reversed to keep backwards compatibility. Also, in pretty much every other language / preserves type. i would make more sense then for // to automatically convert to float, not / - thang 2017-09-11 20:22


51

Oops, immediately found 2//2.

2009-08-15 21:50
by Jonas Byström
Could you elaborate - dangonfast 2017-10-09 08:13
Using this will output an int, not a float @dangonfast - Ashish Ahuja 2018-05-21 05:02


30

Hope it might help someone instantly.

Behavior of Division Operator in Python 2.7 and Python 3

In Python 2.7: By default, division operator will return integer output.

to get the result in double multiple 1.0 to "dividend or divisor"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

In Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real
2017-07-02 06:57
by VijayNaidu
By the way, no need to multiply by 1.0. It is enough that one of the numbers is a float. E.g., 100/35.0 = 100.0/35 = 2.85714285714285 - Tal J. Levy 2018-10-08 09:26


19

The accepted answer already mentions PEP 238. I just want to add a quick look behind the scenes for those interested in what's going on without reading the whole PEP.

Python maps operators like +, -, * and / to special functions, such that e.g. a + b is equivalent to

a.__add__(b)

Regarding division in Python 2, there is by default only / which maps to __div__ and the result is dependent on the input types (e.g. int, float).

Python 2.2 introduced the __future__ feature division, which changed the division semantics the following way (TL;DR of PEP 238):

  • / maps to __truediv__ which must "return a reasonable approximation of the mathematical result of the division" (quote from PEP 238)
  • // maps to __floordiv__, which should return the floored result of /

With Python 3.0, the changes of PEP 238 became the default behaviour and there is no more special method __div__ in Python's object model.

If you want to use the same code in Python 2 and Python 3 use

from __future__ import division

and stick to the PEP 238 semantics of / and //.

2016-09-05 14:18
by code_onkel
Ads