Skip to content

How to Check If a Float Number Is an Integer in Python

Learn reliable ways to verify whether a Python float represents a whole number, accounting for precision errors with methods like is_integer(), modulo arithmetic, and tolerance-based comparisons.

In Python, floating-point numbers (float) are approximations of real numbers. Due to how computers store decimals (IEEE 754 standard), a float might look like an integer (e.g., 5.0) or have a tiny decimal remainder due to precision errors (e.g., 3.0000000000000004).

This guide explains how to check if a float represents a whole number using the built-in is_integer() method, direct integer comparison, and modulo arithmetic.

Understanding Floating-Point Precision

Before checking if a number is an integer, it's vital to understand that floats are often imprecise.

val = 0.1 + 0.2
print(f"Value: {val}")

Output:

Value: 0.30000000000000004

Although mathematically 0.1 + 0.2 = 0.3, the computer stores it with a tiny error. A strict integer check might fail here unless you round the number first.

Python float objects have a built-in method .is_integer() that returns True if the float has no fractional part.

num1 = 5.0
num2 = 5.5

print(f"{num1} is integer? {num1.is_integer()}")
print(f"{num2} is integer? {num2.is_integer()}")

Output:

5.0 is integer? True
5.5 is integer? False

Method 2: Using the Modulo Operator %

You can use the modulo operator % 1. If a number divided by 1 has a remainder of 0, it is an integer.

def check_integer_modulo(n):
    return n % 1 == 0

print(f"4.0: {check_integer_modulo(4.0)}")
print(f"4.2: {check_integer_modulo(4.2)}")

Output:

4.0: True
4.2: False

Method 3: Comparing with Casted Integer

Another common approach is checking if the float is equal to itself cast as an integer.

num = 12.0


if num == int(num):
    print(f"{num} is effectively an integer.")
else:
    print(f"{num} has a decimal part.")

Output:

12.0 is effectively an integer.

Handling Precision Errors (Tolerance)

If you are dealing with calculation results (like 0.1 + 0.2), standard checks return False. You might need to use a tolerance (epsilon).

import math

val = 0.1 + 0.2  # 0.30000000000000004

print(f"Is integer? {val.is_integer()}") 

is_close = math.isclose(val, round(val), rel_tol=1e-9) # 0.3 is NOT an integer, but this logic helps for numbers like 3.000000004

val2 = 3.0 + 4e-16
print(f"Value 2: {val2}")
print(f"Close to int? {math.isclose(val2, round(val2))}")

Output:

Is integer? False
Value 2: 3.0000000000000004
Close to int? True

Conclusion

To check if a float has no decimal part:

  1. Use x.is_integer() for the cleanest, most Pythonic solution.
  2. Use x % 1 == 0 as a mathematical alternative suitable for other languages too.
  3. Use math.isclose() if your float comes from imprecise calculations and might have a microscopic remainder.
Navigation