我正在尝试编写一个非常简单的程序,它首先读取一个整数N,然后读取N个 float 数据,然后将它们放回屏幕上,小数点后有2位数字。这很简单,对吧?但出了问题!这是源代码:
#include<cstdio>
int main()
{
float d;
int n;
scanf("%d",&n);
while(n>0)
{
n--;
scanf("%f",&d);
printf("%.2f\n",d);
}
return 0;
}
当我输入较小的值(例如 3.1 或 1.0)时,效果非常好。但是当我给出大值(例如 -765057.71 或 978715.10)时,它会打印不同的值。从 -765057.71 开始,它打印 -765057.69,对于下一个,它打印 978715.13。为什么会发生这种情况?我该如何解决这个问题?
最佳答案
原始浮点类型没有无限的精度。正如您所看到的,有些值无法准确表示。您可以通过使用 double 而不是 float 来稍微缓解此问题,但对于足够大的值,您仍然会看到相同的问题。
其他更强大的解决方案包括使用预构建的任意精度库、滚动您自己的此类库(如果您有时间消磨时间)、使用两个整数表示浮点值,一个表示小数点之前的部分一个用于后面的部分,或者(如果您只想将数字回显到给定的小数位置)改为使用字符串。
您可能会发现这篇文章很有趣:http://en.wikipedia.org/wiki/IEEE754
关于c++ - 读取浮点值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577561/