如何检查商是否为整数?C++

Edw*_*ara 2 c++

我是初学者,我正在寻找一种方法来检查 C++ 中的商是否是整数。

例如:

int a;
double b;
cin >> a;
b = a / 4;
Run Code Online (Sandbox Code Playgroud)

我怎么知道 b 不是整数(比如 5/4=1.25)?

dat*_*olf 5

在像 C 这样的语言中,当声明整数类型的变量时,其中的值始终是整数。不过我猜你要问的是,如何检查计算结果是否是整数值。如果您正在使用整数类型进行算术,最简单的理解方法是执行逆运算并测试结果是否与原始输入匹配。

\n\n

编辑如果两个操作数都是整数类型(如问题编辑之前),那么您可以执行以下操作:

\n\n
b = a / 4;\nif( b*4 == a ){\n    cout << "a/4 is integer";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,还有其他方法可以做到这一点。例如,使用余数运算符%(经常与模 \xe2\x80\x93 或错误的范数混淆)。在许多 CPU 架构上,执行除法运算也会得到余数。这

\n\n
b = a / 4;\nif( b%4 == 0 ){\n    cout << "a/4 is integer";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

将接近最优,因为单个 CPU 指令将执行这两项计算(在前两行上),并且如果没有余数,比较通常会测试除法运算设置的特殊标志。

\n\n

*但是,如果浮点运算进入图片(就像问题编辑后的情况),事情就会变得有点麻烦。您不再可以进行反转测试,因为浮点运算不精确\xc2\xb9。

\n\n

如果您感兴趣的是余数/模,那么最好的选择是使用该fmod函数,然后测试结果是否在精度误差 epsilon 的范围内。

\n\n
if( DBL_EPSILON > fmod(a, 4) ){\n        cout << "a/4 is integer (within double floating point precision)";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您需要商和余数,那么我的首选方法是截断和减去(通常更快):

\n\n
double b = a/4.;\ndouble b_r = b - trunc(b);\nif( DBL_EPSILON > fabs(b_r) ){\n        cout << "a/4 is integer (within double floating point precision)";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

1:对于大多数涉及的数字;有一组数字,在浮点算术运算中使用时将产生精确的结果。但这只是浮点数可表示的所有数字的一小部分。

\n