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