当num是double时,为什么((num / i) % 1 == 0)
在C ++中不起作用?我将如何编写此代码,通过检查是否留下余数(等等0.3333)来检查因子。
int getFactorials (double num)
{
int total = 0; // if (total / 2) is equal too 'num' it is a perfect number.
for (int i = 1; i < num; i++)
{
if ((num / i) % 1 == 0)
{
cout << i << endl;
}
}
return 0;
}
答案 0 :(得分:7)
%
运算符仅允许用于整数类型(和用户定义的)
超载它的类型)。对于浮点,您需要该功能
fmod
。
答案 1 :(得分:5)
实际上你要做的是检查n
是否可以被i
整除,所以你需要改变的是
if ((num / i) % 1 == 0)
到
if (num % i == 0)
您应该知道这很容易出错,因为您使用double
作为num
的类型。您应该使用int
代替。
答案 2 :(得分:2)
%
运算符由C ++11§5.6/ 4定义:
如果商a / b在结果类型中可表示,(a / b)* b + a%b等于a。
这对于浮点类型来说毫无意义。模数的定义取决于除法舍入为整数。
正如James Kanze所说,请改用std::fmod
。
答案 3 :(得分:0)
此代码返回一个双重对象
(num / i)
仅允许int类型的模运算。您可以将其转换为int type
( ((int) (num / i) ) % i)