不能对双打使用模数吗?

问题描述 投票:0回答:5

我有一个 C++ 程序(使用 g++ 编译)。我试图将两个双精度数作为操作数应用于模函数,但出现以下错误:

错误:“double”和“double”类型的操作数对二进制“operator%”无效

这是代码:

int main() {
    double x = 6.3;
    double y = 2;
    double z = x % y;
}
c++ floating-point double modulo
5个回答
337
投票

%
运算符用于整数。您正在寻找
fmod()
函数

#include <cmath>

int main()
{
    double x = 6.3;
    double y = 2.0;
    double z = std::fmod(x,y);

}

40
投票

fmod(x, y)
是您使用的功能。


8
投票

您可以实现自己的模函数来为您做到这一点:

double dmod(double x, double y) {
    return x - (int)(x/y) * y;
}

然后你可以简单地使用

dmod(6.3, 2)
来获得余数,
0.3


6
投票

使用

fmod()
中的
<cmath>
。如果您不想包含 C 头文件:

template<typename T, typename U>
constexpr double dmod (T x, U mod)
{
    return !mod ? x : x - mod * static_cast<long long>(x / mod);
}

//Usage:
double z = dmod<double, unsigned int>(14.3, 4);
double z = dmod<long, float>(14, 4.6);
//This also works:
double z = dmod(14.7, 0.3);
double z = dmod(14.7, 0);
double z = dmod(0, 0.3f);
double z = dmod(myFirstVariable, someOtherVariable);

0
投票

这是一个同时适用于正数和负数的函数:

#include <cmath>

inline double nmod(double x, double y) {
    return std::fmod(std::fmod(x, y) + y, y);
}

如果

x
为负数或正数,它将始终返回正数。

注意,如果

y
为负数,则返回值将为负数。如果您需要一个在任何情况下都返回正值的函数,那么需要在 std::fabs()
 上使用 
y
,即:

inline double nmod2(double x, double y) {
    return std::fmod(std::fmod(x, y) + std::fabs(y), y);
}
© www.soinside.com 2019 - 2024. All rights reserved.