#include<iostream>
using namespace std;
int main()
{
float sum=0.0;
for(int i=0;i<10;i++)
{
sum=sum+0.01;
}
cout<<sum<<endl;
if(sum==0.1)
{
cout<<"相等"<<endl;
}
else
{
cout<<"不相等"<<endl;
}
return 0;
}
/*
小结:
1)运行结果
0.1
不相等
2)解释
通过分析,表达式sum==0.1虽然在数学上应该为真,但在程序中却不为真。
原因是浮点类型的有限精度导致在重复的累加操作中引入舍入误差,所以
在程序中的结果是不相等的
3)解决:
一般在检查两个浮点数是否相等时,可以通过指定最大误差容限,来检查
这两个值是否足够接近,而不是直接测试它们是否相等或者不等,例如可以
预先指定最大误差容限:
const float Delta=0.00001,然后把sum=0.1改成:fabs(sum-0.1)<=Delta
即可,其中使用数学库函数fabs(),来返回浮点参数的绝对值
*/
///////////////////正确的比较方式代码如下://////////////////////////////////
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
float sum=0.0;
const float Delta=0.00001;
for(int i=0;i<10;i++)
{
sum=sum+0.01;
}
cout<<sum<<endl;
if(fabs(sum-0.1)<=Delta)
{
cout<<"相等"<<endl;
}
else
{
cout<<"不相等"<<endl;
}
return 0;
}
你需要在显示器上面正确显示一个数字,但是这个数字有很多的垃圾信息,浮点型数据后面的零和双精度数据后面的鸡蛋不是我想要的,当然了,谁会在乎0.000000001分,因此有必要休整一下我们的小数点军团。
比如我们有12元3角5分,不对,我们应该按照银行家(当然会让我想起银行家算法,一种借钱的规则))的计算方式得出本钱加上利息,一共是100000200.2300222元。问题是显示器不给力啊。只好忍痛割爱保留小数点后两位。但是很不幸我们选择了一个很悲催的数字,如果先是上面的数字乘以100,然后强制转换类型成无符号整型(有符号整型可以吗?当然可以,储蓄用户只是不希望支票透支的),已经出现溢出,糟糕,用户说我的一个亿不见了。
如果不出现上面这么庞大的数字(当然一个小小的平凡人家,就顶多四五个零,但他是比尔),乘以100,然后强制转换类型去掉小数点后面的臭鸡蛋,然后再格式化输出,当然是求模了。
就是因为无符号整型能够表示的最大范围是4000000000,也就是40亿,我们需要提供最高国民待遇,另类的方法处理(先睡觉,困了午安)