我的目标是检查除以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)


其中第二个参数是与float最接近的IEEE754(假设平台使用该参数)。

幸运的是,尽管数学模数在乘法中是分布的,所以您可以将其放置为

double rem = (long long)std::round(a * 10) % (long long)std::round(b * 10) / 10.0;


根据表示原始问题所需的小数位数使用更大的10的幂。

关于c++ - 如何检查-使用fmod(浮点数)得到余数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55483509/

10-12 20:37