为什么数字 51444.325061 不四舍五入到 51444.325 最多 3 位小数?我想在 c 编程中四舍五入这个数字

why does the number 51444.325061 doesnot round off to 51444.325 upto 3 decimal places? I want to round off this number in c programming

#include <stdio.h>
#include <stdlib.h>

int main() {
    float n;
    scanf("%f", &n);
    printf("%.3f", n);
}

输入:51444.325061

我的输出:51444.324

预期输出:51444.325

为什么我没有得到正确的答案?

32 位 float 可以编码大约 232 个不同的值。

51444.325061不是其中之一**。而最近的 float 正好是 51444.32421875。下一个最佳选择是 51444.328125。

打印 51444.32421875 到小数点后 3 位最好是“51444.324”。


why does I dont get the proper answer?

float 太不精确,无法按照 OP 的要求对 51444.325061 进行编码。使用 double 会有所帮助。存在同样的问题,但仅在需要大约 16+ 有效数字时出现。


** 可编码有限值的形式为:some_integer * 2some_exponent.

在内部,浮点数并不像您所期望的那样表示为小数。相反,他们使用基于 binary (base-2) 数字的浮点表示。

因为它们是以 2 为底,所以这些浮点数不能精确表示小数。

以下是可用的 float 最接近 51444.325061 的值,以及它们的精确十进制等值:

0x4748f452  51444.32031250  0.784978032112121582031250 × 2^16
0x4748f453  51444.32421875  0.784978091716766357421875 × 2^16
0x4748f454  51444.32812500  0.784978151321411132812500 × 2^16
0x4748f455  51444.33203125  0.784978210926055908203125 × 2^16

因此您可以在 51444.324 或 51444.328 之间选择。但显然51444.324更接近