我如何使用 fmod(浮点数)检查 - 并获得余数?
How can I check for - and get a remainder using fmod (floats)?
我的目标是检查除以 2 个浮点数时是否还有余数,如果有,则将余数返还给用户。
给定以下代码,我原以为 fmod(2, 0.2)
会是 0,但是,我得到了 0.2
。我读到这与浮点问题有关。但是有什么办法可以正确地做到这一点?
int main() {
float a = 2.0;
float b = 0.2;
float rem = fmod(a, b);
if (rem > 0) {
std::cout << "There is a remainder: " << rem << std::endl;
} else {
std::cout << "No remainder: " << rem << std::endl;
}
}
输出:
There is a remainder: 0.2
是的,你的预感是正确的。 std::fmod
正在计算
std::fmod(2.0f, 0.20000000298023223876953125f)
其中第二个参数是最接近的 IEEE754(假设您的平台使用它)float
到 0.2
。
幸运的是,虽然数学模数在乘法中是分配的,所以你可以重新定义为
double rem = (long long)std::round(a * 10) % (long long)std::round(b * 10) / 10.0;
根据表示原题所需的小数位数,使用10的较大次方
我的目标是检查除以 2 个浮点数时是否还有余数,如果有,则将余数返还给用户。
给定以下代码,我原以为 fmod(2, 0.2)
会是 0,但是,我得到了 0.2
。我读到这与浮点问题有关。但是有什么办法可以正确地做到这一点?
int main() {
float a = 2.0;
float b = 0.2;
float rem = fmod(a, b);
if (rem > 0) {
std::cout << "There is a remainder: " << rem << std::endl;
} else {
std::cout << "No remainder: " << rem << std::endl;
}
}
输出:
There is a remainder: 0.2
是的,你的预感是正确的。 std::fmod
正在计算
std::fmod(2.0f, 0.20000000298023223876953125f)
其中第二个参数是最接近的 IEEE754(假设您的平台使用它)float
到 0.2
。
幸运的是,虽然数学模数在乘法中是分配的,所以你可以重新定义为
double rem = (long long)std::round(a * 10) % (long long)std::round(b * 10) / 10.0;
根据表示原题所需的小数位数,使用10的较大次方