我是初学者,我正在寻找一种方法来检查 C++ 中的商是否是整数。
例如:
int a;
double b;
cin >> a;
b = a / 4;
Run Code Online (Sandbox Code Playgroud)
我怎么知道 b 不是整数(比如 5/4=1.25)?
在像 C 这样的语言中,当声明整数类型的变量时,其中的值始终是整数。不过我猜你要问的是,如何检查计算结果是否是整数值。如果您正在使用整数类型进行算术,最简单的理解方法是执行逆运算并测试结果是否与原始输入匹配。
\n\n编辑如果两个操作数都是整数类型(如问题编辑之前),那么您可以执行以下操作:
\n\nb = a / 4;\nif( b*4 == a ){\n cout << "a/4 is integer";\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然而,还有其他方法可以做到这一点。例如,使用余数运算符%(经常与模 \xe2\x80\x93 或错误的范数混淆)。在许多 CPU 架构上,执行除法运算也会得到余数。这
b = a / 4;\nif( b%4 == 0 ){\n cout << "a/4 is integer";\n}\nRun Code Online (Sandbox Code Playgroud)\n\n将接近最优,因为单个 CPU 指令将执行这两项计算(在前两行上),并且如果没有余数,比较通常会测试除法运算设置的特殊标志。
\n\n*但是,如果浮点运算进入图片(就像问题编辑后的情况),事情就会变得有点麻烦。您不再可以进行反转测试,因为浮点运算不精确\xc2\xb9。
\n\n如果您感兴趣的是余数/模,那么最好的选择是使用该fmod函数,然后测试结果是否在精度误差 epsilon 的范围内。
if( DBL_EPSILON > fmod(a, 4) ){\n cout << "a/4 is integer (within double floating point precision)";\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您需要商和余数,那么我的首选方法是截断和减去(通常更快):
\n\ndouble 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}\nRun Code Online (Sandbox Code Playgroud)\n\n1:对于大多数涉及的数字;有一组数字,在浮点算术运算中使用时将产生精确的结果。但这只是浮点数可表示的所有数字的一小部分。
\n