我正在尝试制作一个非常简单的程序,它首先会读取一个整数N,之后它会读取N个数据,它们是浮点数,然后将它们放回到小数点后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。为什么会发生这种情况,以及如何解决这个问题?
答案 0 :(得分:3)
原始浮点类型没有无限的精度。正如您所看到的,有些值无法准确表示。您可以使用double
代替float
来缓解此问题,但是对于足够大的值,您仍会看到相同的问题。
其他更强大的解决方案包括使用预建的任意精度库,滚动自己的库(如果你有时间杀死),使用两个整数表示浮点值,一个用于小数点前的部分一个用于后面的部分,或者(如果你想做的就是将数字反馈回到截断到给定的小数位),而不是使用字符串。
您可能会发现这是一篇有趣的读物:http://en.wikipedia.org/wiki/IEEE754
答案 1 :(得分:2)
因为单精度浮点数不能将-765057.71存储到那么多精度数字。它可以存储最有效数字,但在某些时候它或多或少地“舍入”。
单精度浮点数(float
)获得大约7位精度的十进制数字。如果需要更多,则需要使用双精度浮点数(double
)。
答案 2 :(得分:1)
浮点数仅是近似表示。我建议你阅读文章here