这个问题很多地方都提到了。《高质量C++编程指南》中说了很多了,我也想说一些。
1、关于float和double。记得有一次写一个工控的程序,为了适应数据的大范围,将参数类型选择为double型了。但是测试过程中发现double型的存在误差,如传入的参数为A=1.00000,但是获得的参数值却是A=0.99999999987等这样的数据。后来想到double数据的判断应该使用范围判断,即这么判断:1.00000-Max_Error<A<1.00000+Max_Error,Max_Error是允许的最大误差,其可以将其定义为宏。我要说的问题是:我后来发现float则没有误差。为什么float没有误差呢?至今没有弄明白原因。要说明的是使用double的时候并不是每个数都有误差!有时候是正确的。但是有时候传入的某些值就会有误差。估计和double的内存结构有关!
尽管float没有误差,但是希望以后能养成使用范围比较的习惯。
/********************************************************************************/
一般浮点小数是用二进制小数表示的,和整数部分类似,小数也是2的幂次方,只不过幂次是负数而已。
例如:0.5(10)表示为0.1(2),通俗的说,就是2^-1,也就是1/2,同样:0.25(10)表示为0.01(2),即2^-2,也就是1/4。对于一个定长的小数,例如8位二进制小数,其实际的值就是所有位上的值相加而成,例如:
0.75(10)=0.11(2)=1/2+1/4
因此对于像0.1(10)这样的值需要很多值进行相加,设8位二进制小数,那么
0.1(10) 可表示为 0.00011001(2) = 1/16+1/32+1/256 = 0.09765625
或者
0.1(10) 可表示为 0.00011010(2) = 1/16+1/32+1/128 = 0.1015625
由于0.00011001和0.00011010之间已经没有可用的二进制表示了(相对于8位定长二进制小数来说),因此只能用这两个值来代替0.1,具体取那个根据实际的舍入规则确定,由此出现了误差。
所以,对于二进制小数来说,只有2的负整数次幂的小数才能够精确表示,否则就可能出现误差。
/**************************************************************************************************/
2、BOOL和bool类型。其实在C/C++中BOOL定义为:
typedef int BOOL;
#define FALSE 0
#define TRUE 1
也就是说其实BOOL类型就是int类型,而bool类型则只是有true和false这两个值的一种类型。由于BOOL是int类型的所以,特别的是TRUE在VB中被定义为-1。所以不要在比较的时候将值于TRUE或者1比较,这样比较危险!另外在MFC程序中定义的BOOL类型和bool类型虽然能混用,但是我个人觉得如果是使用MFC编程最好使用BOOL类型的TRUE和FALSE,至少让人觉得风格一致,呵呵!