Python Numbers
Learn about numeric data types in Python: integers, floats, and complex numbers.
Python Numbers
There are three numeric types in Python:
intfloatcomplex
Variables of numeric types are created when you assign a value to them:
Example
x = 1 # int
y = 2.8 # float
z = 1j # complexTo verify the type of any object in Python, use the type() function:
Example
print(type(x))
print(type(y))
print(type(z))Int
Int, or integer, is a whole number, positive or negative, without decimals, of unlimited length.
Example
x = 1
y = 35656222554887711
z = -3255522
print(type(x))
print(type(y))
print(type(z))Float
Float, or "floating point number" is a number, positive or negative, containing one or more decimals.
Example
x = 1.10
y = 1.0
z = -35.59
print(type(x))
print(type(y))
print(type(z))Float can also be scientific numbers with an "e" to indicate the power of 10.
Example
x = 35e3
y = 12E4
z = -87.7e100
print(type(x))
print(type(y))
print(type(z))Complex
Complex numbers are written with a "j" as the imaginary part:
Example
x = 3+5j
y = 5j
z = -5j
print(type(x))
print(type(y))
print(type(z))Type Conversion
You can convert from one type to another with the int(), float(), and complex() methods:
Example
x = 1 # int
y = 2.8 # float
z = 1j # complex
# convert from int to float:
a = float(x)
# convert from float to int:
b = int(y)
# convert from int to complex:
c = complex(x)
print(a)
print(b)
print(c)
print(type(a))
print(type(b))
print(type(c))Note: You cannot convert complex numbers into another number type.
Random Number
Python does not have a random() function to make a random number, but Python has a built-in module called random that can be used to make random numbers:
Example
import random
print(random.randrange(1, 10))Number Methods
Python has several built-in functions for working with numbers:
abs()
Returns the absolute value of a number
print(abs(-7.25))round()
Rounds a number to a specified number of decimals
print(round(8.6))max()
Returns the largest item in an iterable
print(max(5, 10, 25))min()
Returns the smallest item in an iterable
print(min(5, 10, 25))pow()
Returns the value of x to the power of y
print(pow(4, 3))sum()
Sums the items of an iterable
print(sum([1, 2, 3, 4, 5]))The Floating-Point Trap
Computers store floats in binary, so some decimals cannot be represented exactly. This is not a Python bug — it affects every language.
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False!
# compare with a tolerance instead
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True
# for exact decimal math (money), use Decimal
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2")) # 0.3Never use == to compare floats, and never store money in float. Use math.isclose for comparisons and Decimal for currency.
Handy Numeric Tools
print(abs(-7)) # 7
print(round(3.14159, 2)) # 3.14
print(pow(2, 10)) # 1024 (same as 2 ** 10)
print(10 // 3, 10 % 3) # 3 1 (floor division, remainder)
print(divmod(10, 3)) # (3, 1)
print(1_000_000) # 1000000 -> underscores aid readabilityTry It Yourself
Exercise 1: Safely check whether 1.1 + 2.2 equals 3.3.
Show solution
import math
print(math.isclose(1.1 + 2.2, 3.3)) # TrueExercise 2: Get the quotient and remainder of 17 divided by 5 in one call.
Show solution
print(divmod(17, 5)) # (3, 2)Key Takeaways
- Python has
int(unlimited size),float, andcomplex. - Floats are approximate — compare with
math.isclose, not==. - Use
Decimalfor money and exact decimals. //is floor division,%is remainder,**is power.
📘 Real-World Deep Dive
Numeric code is everywhere — counters, prices, percentiles, scientific data. Knowing the difference between <code>int</code>, <code>float</code>, <code>complex</code>, and <code>Decimal</code> is essential, as is the <code>math</code> / <code>statistics</code> / <code>decimal</code> / <code>fractions</code> modules.
Real-Life Scenario
A small metrics calculator: mean, stdev, percentile, with explicit rounding behaviour.
Real-Life Example
import math
import statistics as st
from decimal import Decimal, ROUND_HALF_UP
from fractions import Fraction
samples = [1.2, 1.5, 1.4, 1.6, 1.8, 2.0, 1.7]
mean = st.fmean(samples)
stddev = st.stdev(samples)
p95 = st.quantiles(samples, n=20)[-1]
print(f"mean = {mean:.3f}")
print(f"stdev = {stddev:.3f}")
print(f"p95 = {p95:.3f}")
price = Decimal("19.99")
tax = Decimal("0.0875")
total = (price * (Decimal("1") + tax)).quantize(Decimal("0.01"), ROUND_HALF_UP)
print("total =", total)
half = Fraction(1, 2) + Fraction(1, 3)
print("1/2+1/3 =", half, "≈", float(half))Expected Output
mean = 1.614
stdev = 0.245
p95 = 1.940
total = 21.74
1/2+1/3 = 5/6 ≈ 0.8333333333333333Common mistakes
0.1 + 0.2 == 0.3isFalse— float is base-2; useDecimalfor display-grade arithmetic.statistics.stdevreturns the *sample* stdev (n-1),pstdevreturns the *population* (n) — mix-ups change reports.math.floor(-1.5) == -2whileint(-1.5) == -1— pick deliberately.
🚀 Performance & Best Practices
math.fsumis more accurate than the built-insumfor long float sequences.- Pre-compute
1.0 / nrather than dividing per element in a hot loop. - For percentiles over huge arrays use
numpy.percentilerather thanstatistics.quantiles.
🧪 Try It Yourself
- Compute the harmonic mean of
sampleswithstatistics.harmonic_mean. - Sum one million floats with both
sumandmath.fsumand compare the error vs.Decimal. - Round
1.5withround(),math.floor, andDecimal.quantize(ROUND_HALF_UP)— note the ties-to-even default ofround().