[Есть несколько вопросов по этому вопросу, но ни один из ответов не является особенно окончательным, а некоторые устарели от текущего стандарта С++].
Мои исследования показывают, что это основные методы, используемые для проверки того, можно ли преобразовать значение с плавающей запятой в интегральный тип T
.
-
if (f >= std::numeric_limits<T>::min() && f <= std::numeric_limits<T>::max() && f == (T)f))
-
используя
std::fmod
, чтобы извлечь остаток и проверить равенство на 0. -
используя
std::remainder
и проверим равенство 0.
В первом тесте предполагается, что определен экземпляр из f
в экземпляр T
. Не верно для std::int64_t
до float
, например.
С С++ 11, какой из них лучше? Есть ли лучший способ?