为什么51444.325061这个数字在小数点后3位没有四舍五入到51444.325?我想在c编程中把这个数字四舍五入


#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不同的值。

CCD_ 5不是其中之一**。相反,最近的float正好是51444.32421875。下一个最佳选择是51444.328125。

将51444.32421875打印到小数点后3位是最好的;51444.324〃;。


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

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


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

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

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

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

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更接近。