При обработке вещественных чисел следует определиться, которая точность вас устраивает в данном случае.
В идеале 1.0 - это явно целочисленная дробь, но на практике возникает вопрос: а 0.99999999 - это достаточное приближение, чтобы принимать это число за 1.0?
Поэтому функция должна иметь параметр точности:
bool is_integer(double val, double precision = 0.000005)
{
return abs(val - round(val)) < precision;
}