5

I tried performing following typecast operation in Python 3.3

int( 10**23 / 10 )

Output: 10000000000000000000000

And after increasing power by one or further

int( 10**24 / 10 )

Output: 99999999999999991611392

int( 10**25 / 10 )

Output: 999999999999999983222784

Why is this happening? Although a simple typecasting like

int( 10**24 )

Output: 1000000000000000000000000

is not affecting the values.

Community
  • 1
  • 1
SMagic
  • 317
  • 2
  • 10
  • 2
    There is no type casting, only conversion. Use `//` instead to get floor division, and avoid creating a floating point number (which is where your errors come from). – Martijn Pieters Aug 07 '15 at 17:11
  • related: http://stackoverflow.com/q/1282945/674039 – wim Aug 07 '15 at 17:15

2 Answers2

6

You are doing floating-point division with the / operator. 10**24/10 happens to have an inexact integer representation.

If you need an integer result, divide with //.

>>> type(10**24/10)
<class 'float'>
>>> type(10**24//10)
<class 'int'>
Simon
  • 506
  • 2
  • 8
3

In Python 3.x, / always does true(floating point) division. Using floor division // instead could give you the expected result.

>>> int(10**25 // 10)
1000000000000000000000000

The reason of this behavior is that float can't store big integers precisely.

Assuming IEEE-754 double precision is used, it can store integers at most 253 precisely, which is approximitely 1016. Another example:

>>> int(10**17 / 10 + 1)
10000000000000000
Yu Hao
  • 119,891
  • 44
  • 235
  • 294