与 int 相比,double 数据类型如何在 C++ 中大量改变答案?

How does double data type change the answer compared to int, by a huge amount in C++?

我正在解决一个问题“计算阶乘的位数”,并将答案存储在两种数据类型 int 和 double 中。两种数据类型的答案是不同的,存储在 double 中的那个最终是正确的。这是怎么回事?

代码如下:

        int n;
        cin>>n;
        double ans;
        int ans_int;
        double digits = 0;
        int digit_int = 0; 
        for (int i = 1; i<=n; i++) {
            digits += log10(i);
            digit_int += log10(i);
        }

        ans = floor(digits)+1;

        ans_int = floor(digit_int)+1; // This gives wrong answer. 

        cout<<ans<<endl;

如果在上面的代码中,我将数字作为 int 而不是 double,我得到的答案是 1 位,在 5 中!而不是 3,在其他情况下类似。

问题出在这一行:digit_int += log10(i);。当 i 小于 10 时,其对数将小于 1。将小于 1 的值加到整数上将有效地加零。

将双精度数转换为 int,首先将其向下舍入为最接近的整数。所以如果你加起来说 log10(x) for x ≤ 10 ≤ 99,对数总是在 1 和 2 之间,但是转换为 int 只会加 1,而不是正确的值。