You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中float转int精度异常:uniquePaths函数计算结果不符问题

问题原因及解释

核心问题:浮点数精度误差

这段代码的问题出在double类型的精度限制上。

当输入m=53、n=4时,我们需要计算的组合数是C(55, 3) = 55×54×53/(3×2×1) = 26235,这是一个整数。但代码中用double类型逐步计算时,由于浮点数的二进制存储特性,实际得到的ans值可能是一个略小于26235的近似值(比如26234.999999999996)——double的有效位数有限,无法精确表示所有整数,尤其是当数值较大时,容易出现这类微小误差。

为什么cout显示26235?

cout输出double时,默认会对数值进行格式化四舍五入。当数值非常接近某个整数时,会直接显示为该整数。所以即使ans实际存储的是26234.999999999996,cout也会输出26235。

为什么强转int得到26234?

将double强制转换为int时,只会截断小数部分,不会做四舍五入。所以当ans是26234.999999999996时,(int)ans会直接去掉小数部分,得到26234。

修复方案:用整数运算替代浮点数

组合数必然是整数,所以可以用整数类型(比如long long,避免溢出)来计算,确保每一步运算都是整数:

int uniquePaths(int m, int n) {
    long long ans = 1;
    int k = min(m - 1, n - 1); // 取较小的数减少循环次数,提升效率
    for (int i = 1; i <= k; ++i) {
        ans = ans * (m + n - 2 - k + i) / i;
    }
    cout << ans;
    return static_cast<int>(ans);
}

内容的提问来源于stack exchange,提问作者Ajay Bhardwaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:50:20