每当我在此代码中输入 4.2 时,nm 的值为 19,其中预期为 20

Whenever I enter 4.2 in this code, the value of nm is 19, where 20 is expected

我想在变量 nm 中得到 20。但它返回 19.

我该如何解决?是什么导致了这个问题?

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{

    float m;

    int n = 0;
    do {
         m = get_float("Enter:");

        }while(m < 0);
    int nm =(m * 100 );
    while(nm >= 25 ){
        nm = nm - 25;
        n = n + 1;

    }

    printf("%i\n",n);
    printf("%i\n", nm);
}

一个 32 位 float 可以编码大约 232 个不同的值 正好 。由于典型 float 的二进制性质,4.2 不是其中之一。

相反 m 的值为 4.1999998...

// closest float
4.19999980926513671875
// hoped for value
4.2
// next closest float
4.200000286102294921875

多路复用 100 会导致一些舍入,因此 m*100 的最佳答案是 419.999969482421875

int nm =(m * 100 ); 结果 nm == 419 因为将 float 赋值给 int 会截断小数部分。


考虑四舍五入到最接近的整数而不是通过 int 赋值截断并使用 double 常量。

#include <math.h>

// int nm =(m * 100 );
int nm = lround(m * 100.0);
// or 
int nm = round(m * 100.0);