fmod是不正确的?

jba*_*ing -4 c++

鉴于以下双打,确实fmod返回正确的值?

    double x = .090;
    double y = .003;
    double r = fmod(x, y);
    // r = 0.0029999999999999949
Run Code Online (Sandbox Code Playgroud)

为什么r = 0?

Mik*_*our 5

因为,与大多数小数部分一样,这些数字不能用二进制浮点格式精确表示.要查看实际使用的值:

#include <cstdio>

int main() {
    printf("%.20f %.20f\n", .090, .003);
}

Output: 0.08999999999999999667 0.00300000000000000006
Run Code Online (Sandbox Code Playgroud)

这些小的舍入误差意味着第一个值略小于第二个值的精确倍数,因此您看到的结果.

您可能希望允许小错误容差:

if (r > y - some_small_value) {
    r = 0;
}
Run Code Online (Sandbox Code Playgroud)