神奇!!double与float输出的结果

来源:百度知道 编辑:UC知道 时间:2024/06/30 14:31:15
一下是个简单的不能简单的程序:
#include<iostream>
using namespace std;
int main()
{double sum=0;
for(double i=0.01f;i<=1.0f;i+=0.01f)
sum+=i;
cout<<sum;
return 0;
}
输出加过为 50.5 准确无误
但是改为
for(double i=0.01;i<=1.0;i+=0.01)

会吃惊的发现结果为49.5
按理说 这几个数字也不是很小也就小数后2为 用double或者float应该不会影响结果 为什么会导致这么大的误差呢??

#include<iostream>
using namespace std;
int main()
{
double sum=0;
for(int i = 0; i <= 100; i++)
{
sum += 0.01 * i;
}
cout<<sum;
return 0;
}

应该这样。

你这里的问题在于0.01用2进制表示是无限小数,所以最后用双精度保存的只是一个近似值。经过不断的累加导致误差越来越大,双精度的时候加100次的结果已经大于1了。所以最后的1就没加。单精度的时候误差是向下的,所以加100次后结果还没到1,所以最后的1就加上了。当然所谓这个最后的1都是一个非常接近1的数,只不过刚好一个比1大一点一个比1小一点。

避免这种积累误差只能直接用乘法代替累加。

其实你想知道原因最好的办法就算在循环里面加一个cout<<i的语句就知道了,你可以看到每次循环i的值。这样就知道为什么得到的结果不一样了

数字后面加f说明是单精度的,不加默认为双精度的