在 C++ 中将 float 转换为 int

-1 c++ c++17

int uniquePaths(int m, int n) {
    int num = m+n-2;
    int den=1;
    double ans = 1;
    while(den<=m-1) {
        ans = ans*(num--)/(den++);
    }
    cout<<ans;
    return (int)ans; 
}
Run Code Online (Sandbox Code Playgroud)

作为上述代码段的输入,m=53, n=4 的预期答案是 26235,但代码返回 26234。但是,标准输出显示 26235。

您能帮我理解这种行为吗?

Eri*_*hil 5

由于浮点舍入,您的代码计算ans结果为 26,234.999999999985448084771633148193359375。当使用 打印时cout<<ans,默认格式不显示完整值,并将其舍入为 \xe2\x80\x9c26235\xe2\x80\x9d。然而,当实际值转换为 时int,结果是 26,234。

\n

设置为后numm+n-2您的代码正在计算num!/ (( m-1)!( num-m+1)!),当然等于num! / (( num-m+1)!( m-1)!)。因此,您可以使用m-1num-m+1作为限制。因此,您可以将该while行更改为这两行:

\n
    int limit = m-1 < num-m+1 ? m-1 : num-m+1;\n    while(den<=limit) {\n
Run Code Online (Sandbox Code Playgroud)\n

然后你的代码将运行到下限,这将避免除以ans尚未包含在内的因素。所有结果都将是精确的整数结果,没有舍入错误,除非您尝试计算的结果超出了double能够表示所有整数的格式范围(在普遍存在的 IEEE-754 二进制 64 格式中最多为 2 53double ) )。

\n