我是初学者,我正在寻找一种方法来检查C ++中的商是否为整数。
例如:
int a;
double b;
cin >> a;
b = a / 4;
我如何知道b不是整数(类似于5/4 = 1.25)?
答案 0 :(得分:3)
您无需检查b
是否为整数,因为它始终是。你声明它是int
。
此外,因为a
和4
都是整数,a/4
是整数除法,所以即使表达式也不能是小数。
如果你解决了所有问题,那么查看浮点值是否代表整数的一种方法是将其原始值与故意截断为整数的值进行比较:
foobar == static_cast<int>(foobar)
但是,与任何浮点运算一样,这可能容易出现舍入错误,因此您需要更加具体地满足一般要求。
在显示的特定情况下,检查模数会更简单:5 % 4
不为零,因此5/4
不是完整的。
答案 1 :(得分:2)
编辑前:
您的a
和b
变量属于int
类型,因为您已声明它们。无论您尝试通过标准输入提供给它们的值,它们都将保持int
类型。 a / 4
表达式的类型和结果也是int
,因为所有操作数都是integer division中涉及的整数。
编辑后:
如果声明b
类型为double
,则它将保持double
类型,但会收到整数除法的剪切结果a / 4
的类型为int
。因此,如果所有操作数都是整数,则算术表达式的结果也将是整数。要使其类型为double
,请将其中一个操作数强制转换为double
:
double b = static_cast<double>(a) / 4;
或
double b = a / 4.;
答案 2 :(得分:2)
在声明整数类型变量的C语言中,其中的值始终为整数。但是我想你要问的是,如何检查计算结果是否为整数值。如果您正在使用整数类型进行算术,那么最容易理解的方法就是执行逆操作并测试结果是否与原始输入匹配。
编辑如果两个操作数都是整数类型(如问题编辑之前),那么您可以这样做:
b = a / 4;
if( b*4 == a ){
cout << "a/4 is integer";
}
然而,还有其他方法可以做到这一点。例如,使用余数运算符%
(经常与模数混淆 - 或者更确切地说是误解)。在许多CPU架构中,执行除法的操作也给出了余数。此
b = a / 4;
if( b%4 == 0 ){
cout << "a/4 is integer";
}
将接近最优,因为单个CPU指令将执行两个计算(在前两行中),并且如果没有剩余剩余,则比较通常将测试除法操作设置的特殊标志。
*但是如果浮点运算进入图片(就像问题编辑之后的那样),事情会变得有点麻烦。你不再能进行反演测试,因为浮点运算是不精确的¹。
如果您感兴趣的是余数/模数,那么您最好的选择是使用fmod
函数,然后测试结果是否在精确度误差epsilon的范围内。
if( DBL_EPSILON > fmod(a, 4) ){
cout << "a/4 is integer (within double floating point precision)";
}
如果你需要商和余数,那么我首选的方法是截断和减去(通常更快):
double b = a/4.;
double b_r = b - trunc(b);
if( DBL_EPSILON > fabs(b_r) ){
cout << "a/4 is integer (within double floating point precision)";
}
1:涉及的大多数人数;有一组数字,当用于浮点算术运算时会产生精确的结果。但这只是浮点表示的所有数字的一小部分。
答案 3 :(得分:0)
正如其他答案所暗示的那样,如果你将除法赋值给浮点数,你将总是得到一个整数值,因为在C ++(和大多数语言)中,整数除法产生一个整数。
事实上,你甚至不需要b成为float
。您可以执行以下操作之一:
int a;
std::cin >> a;
if (a % 4 == 0) { /* do something */ }
int a;
std::cin >> a;
if (a & 0x11 == 0) { /* do something */ }
如果一个整数的最低有效2位为0,则整数可以被4整除。但实际上,编译器可能会将之前的测试优化为此值。
如果您打算使用/ 4,请尝试:
int a;
std::cin >> a;
auto b = a / 4; /* b is an int... */
if (b * 4 == a) { /* do something */ }
这对于固定除数的情况不是很有用;但如果没有修复,你可以这样做:
int a;
std::cin >> a;
std::cin >> c;
auto b = a / c;
if (b * c == a) { /* do something */ }