首页 > 解决方案 > 如何检查两个双精度数的除法是否为整数?

问题描述

我有两个任意的双打。只有当一个双精度除以另一个双精度是整数时,代码才应该继续。所以我不能真正将结果转换为双倍。我可以做一个正常的双除法,然后检查结果是否在一个指定整数的小范围内,但这看起来很混乱。

有人知道更好的解决方案吗?

谢谢

标签: c++integerdoubledivision

解决方案


要测试一个整数是否可以被另一个整数整除,您可以使用std::fmod. std::fmod返回除法的余数。如果余数为零,则这些数必须能整除。

#include <cmath>

constexpr double EPSILON = 1.0 / 1024 / 1024;

bool divisible(double dividend, double divisor) {
    return std::fabs(std::fmod(dividend, divisor)) < EPSILON;
}

在某些情况下我们不能使用std::fmod,例如在 constexpr 上下文中,因此我们也可以自己进行数学运算:

#include <cstdint>

constexpr bool divisible(double dividend, double divisor) {
    double quotient = dividend / divisor;
    double quotient_fraction = quotient - static_cast<intmax_t>(quotient);
    return quotient_fraction > -EPSILON && quotient_fraction < EPSILON;
}

推荐阅读