鉴于以下双打,确实fmod返回正确的值?
double x = .090;
double y = .003;
double r = fmod(x, y);
// r = 0.0029999999999999949
Run Code Online (Sandbox Code Playgroud)
为什么r = 0?
因为,与大多数小数部分一样,这些数字不能用二进制浮点格式精确表示.要查看实际使用的值:
#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)