c++ 检查浮点数是否为整数的最佳方式

[这里有几个问题,但没有一个答案是特别明确的,有几个是现在的C标准)。

我的研究表明,这些是用于检查浮点值是否可以转换为整数型T的主要方法。

> if(f> = std :: numeric_limits< T> :: min()&& f< = std :: numeric_limits< T> :: max()&& ))
>使用std :: fmod提取余数并将等式测试为0。
>使用std ::余数和测试等于0。

第一个测试假定定义了从f到T实例的转换。例如,std :: int64_t不是浮动的。

有了C 11,哪一个最好?有没有更好的办法?

使用std :: fmod(f,1.0)== 0.0其中f是float,double或long double。如果您担心在使用浮标时不必要的浮点促销的虚假效果,则使用1.0f或更全面的

std :: fmod(f,static_cast< decltype(f)>(1.0))== 0.0

这将在编译时显着地强制正确的超负载被调用。 std :: fmod(f,…)的返回值将在[0,1]的范围内,与0.0相比较完全可以完成整数检查。

如果事实证明f是一个整数,那么在尝试转换之前,请确保它在您选择的类型的允许范围之内:否则您冒险调用未定义的行为。我看到你已经熟悉了std :: numeric_limits,可以帮助你。

我对使用std :: remaining的保留可能是(i)我是Luddite,(ii)它在部分实施C11标准的编译器(如MSVC12)中不可用。我不喜欢涉及铸件的解决方案,因为符号隐藏了相当昂贵的操作,您需要提前检查安全。如果你必须采用你的第一选择,至少用static_cast< T>(f)替换C风格的转换;

翻译自:https://stackoverflow.com/questions/26341494/best-way-of-checking-if-a-floating-point-is-an-integer

转载注明原文:c++ 检查浮点数是否为整数的最佳方式