04 August 2004 20 comments Python

I have a degree in mathematics and computer science, but still I don't know why different programming languages evaluate `Integer/Integer`

differently. On any calculator if you divide one integer with another you get a decimal number (of course not if the numerator is a factor of the denominator).

Python for example returns a integer number:

```
>>> print 3/10
0
>>> print 3/10.0
0.3
```

Perl on the other hand returns a decimal number:

```
print 3/10; print "\n";
print 3/10.0;
...gives...
0.3
0.3
```

PostgreSQL is like Python:

```
database=# SELECT 3/10 AS quotient1, 3/10.0 As quotient2;
quotient1 | quotient2
-----------+------------------------
0 | 0.30000000000000000000
```

And good old MS Excel gives:

```
=3/10 <=> 0.3
```

**Why** is it so?

- Previous:
- Overcomplicated password requirements on Oystercard.com 02 August 2004
- Next:
- Pretty print SQL script 06 August 2004

- Related by Keyword:
- Best EXPLAIN ANALYZE benchmark script 19 April 2018
- When Docker is too slow, use your host 11 January 2018
- How do log ALL PostgreSQL SQL happening 20 July 2015
- Fastest database for Tornado 09 October 2013
- Postgres collation errors on CITEXT fields when upgrading to 9.1 21 May 2012

- Related by Text:
- jQuery and Highslide JS 08 January 2008
- I'm back! Peterbe.com has been renewed 05 June 2005
- Anti-McCain propaganda videos 12 August 2008
- Ever wondered how much $87 Billion is? 04 November 2003
- Guake, not Yakuake or Yeahconsole 23 January 2010

Rickard Westman24 March 2005 ReplyIn C, the choice is a more natural one, since it was designed to be a low-level language focused on efficiency. In the early days, this efficiency was achieved largely by providing a close mapping between hardware functionality and language functionality. This meant that you could get good efficiency even with a simple compiler, by leveraging the programmer's intuitions and experience regarding hardware efficiency (with integer arithmetic being much more efficient than floating-point, provided that the latter was supported at all.) Following this principle, the compiler should not automatically slow down things without very good reasons, while automatically moving from fast integers to slow floating-point arithmetic could easily be seen as violating that principle. Also, integer division is sufficient in many cases, especially when used for data organization (subdivision of datasets) rather than mathematics. The creators of C were working on operating systems, compilers, and other kinds of system software were this was true to a large extent. Floating-point arithmetic was included in the language, but in later practice it was often made optional, if at all (especially on small micros and embedded systems.)

For a high-level language focused on ease-of-use for the programmer, automatic conversion between integer and floating-point "where required" makes a lot of sense. So it is not strange that the other languages you mention work that way. Python is going in that direction as well (see e.g. http://python.fyxm.net/peps/pep-0238.html)

vishruth07 April 2011 ReplyThis is a great piece of information. I very much liked the way you have explained it.

Thanks for answering a question which was very intriguing for me.

Regards,

Vishruth

Italo Tasso31 May 2006 ReplyCalculators do real division. They take a real number, divides it by another real number and return a real number.

In number theory we only work with integers. So we have the integer division. When you divide two numbers, you have the quotient and the remainder.

10 div 3 = 3 (quotient)

10 mod 3 = 1 (remainder)

3 * 3 + 1 = 10

The definition of integer division is: given two numbers a and b, the quotient and remainder or the division of a and b are defined by the formulas:

b*q+r=a

and

0<=r<b

(or 0<=|r|<|b| if dealing with negative numbers)

Perl (as far as I know) does not have a integer division (quotient) operator, but it has a remainder operator. C, Pascal and Python have both operations. But they behave diffent when dealing with negative numbers.

In the definition above, there are two possible values of r, one negative and one positive. In math we always take the positive one, but the languages sometimes take the negative.

C and Pascal (gcc and freepascal to be more specific) truncate the division and then calculate the remainder. Python and Perl, on the other hand, use the floor function instead of truncating. This causes differences in the quotient and remainder when dealing with negative integer division. For example, dividing 3 by (-2):

a = 3, b = -2

b*q+r=a

(-2) * q + r = 3

0<=|r|<2

Two possible solutions:

q=-2

r=-1

(-2) * (-2) + (-1) = 3

or

q=-1

r=1

(-2) * (-1) + (1) = 3

Both are correct. In this case, Perl and Python choose the first one (negative remainder) but Pascal and C choose the second one (positive remainder). On the other hand, if you make a=-3 and b=2, Perl and Python choose the positive r, Pascal and C choose the negative r.

Flomana14 June 2007 Replyprint(... ), SOLA/SOLB * 100 #being SOLA < SOLB Result: 0 #

Solution

print(... ), int(SOLA/(SOLB*1.0) *100, ("%")

Blog: http://flomana.spaces.live.com/

kanenas21 January 2009 ReplyThese days (from version 2.2), Python supports both floor division & floating point division with the '//' and '/' operators, respectively. In python 2.X, you have to import the division feature from __future__ to get this behavior.

from __future__ import division

# prints '0.5 0'

print 1/2, 1//2

lola6911 January 2015 ReplyPeter Bengtsson25 January 2015 ReplyDan Ward25 January 2015 ReplyPeter Bengtsson26 January 2015 ReplyBrandon Rhodes26 January 2015 Reply>>> [n/10 for n in range(-30, 30)]

[-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

The operation n/10 results, over the integers, in runs of exactly 10 identical results, followed by the next integer. If -7/10 had the terrible result of 0, then the above sequence would have 20 zeros in a row instead of 10, making that single number an anomaly in what is otherwise a perfectly symmetrical sequence.

Peter Bengtsson26 January 2015 ReplySusanna Epp01 April 2015 ReplyPeter Bengtsson01 April 2015 ReplyBILL HARRISON20 February 2016 ReplyBest regards, Bearcat

BILL HARRISON21 February 2016 ReplyRegards, Bearcat

BILL HARRISON12 March 2016 ReplyRegards,

Bearcat

Christos Souralis11 May 2016 ReplySomething like that. I have an array of 6 pics for example x = [0 1 2 3 ...6] and a counter i=0; then i++ etc. If the counter goes i = 8 then I want the function to understand that I want to display the pic from the class of 1. 0 1 2 3 4 5 6

7 8 9 10 11 12 13

14.... can be done with javascript?

19 July 2016 ReplyAnonymous11 August 2017 ReplyAnonymousStarting with 1999, C required compilers to perform integer division as truncation toward 0 in order to achieve more predictable behavior.

Another issue is that if one writes code with −7/2, it is treated as −(7/2) which would nearly always be evaluated as −3 regardless of compiler and hardware behavior. That is because in C, − is always a unary operator; there is no such thing as negative integer literals in C. People often forget this detail and are surprised.

15 September 2017 ReplyAnonymous