Я столкнулся с подобными вопросами. Поскольку мне все равно нужно было обойти двойник, вот что я нахожу:
double d = 2.000000001; int i = std::round(d); std::fabs(d-i) < 10 * std::numeric_limits<double>::epsilon()