c++ - 我如何使用 fmod( float )检查 - 并获得余数?

标签 c++ floating-point fmod

我的目标是检查除以 2 个 float 时是否还有余数,如果有,则将余数返还给用户。

给定以下代码,我原以为 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;
    }
}

输出: 有余数:0.2

最佳答案

是的,您的预感是正确的。 std::fmod 正在计算

std::fmod(2.0f, 0.20000000298023223876953125f)

其中第二个参数是最接近 0.2 的 IEEE754(假设您的平台使用它)float

幸运的是,虽然数学模数在乘法中是分配的,所以您可以表示为

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

根据表示原问题所需的小数位数,使用10的较大次方。

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

相关文章:

C程序: help about variable definition sequence

iphone - 架构 i386 的重复符号错误

c++ - 如果在添加 fmod Visual C++ 测试后在一次测试中出现特定代码行,则所有测试均失败,无法获取类型,并出现 FileNotFoundException

c++ - 添加内存 - 动态规划

c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?

c++ - Qt 4 for symbian - 如果项目在 mac 中由 Qt4 Creator 构建,它可以通过 Window 部署到 symbian 吗?

c++ - 传递给线程的 lambda 中的调用函数

比较 C 中的 float

rust - 为什么 Rust 浮点值可以用很少的有效数字保存大值,而整数不能?

c - MiniFMOD编译