首先简单介绍下整型与浮点型。计算机中的数据存储有整型和浮点型两种形式。整型是用二进制形式来表示所有正整数和负整数以及零,由于存储空间的限制,只能表示一定范围的整数。而浮点型则是用二进制的科学计数法形式来表示实数,由于存储空间的限制,不可能精确存储所有的实数,有些实数只能用四舍五入的近似形式存储。一般的计算机语言像C#,c++以及Java等都有相应的类型来实现整型与浮点型。例如在Java中,整型byte,short,int,long,用来表示不同范围的整数,而浮点型则有float和double用来表示不同精度和范围的浮点数。目前整型与浮点型的运算基本都是由运算器来实现,并且这些运算器也大多采用了统一的标准,例如浮点型普遍采用IEEE-754,所以在高级语言中这些基本类型的特点并没有太大的差异。
下面来详细看下,在编程的时候使用这两种类型的时候需要注意的一些问题。
1.小学的时候我们就知道零不能作为除数,在计算机的世界里也是一样,我们需要考虑所有除数是否有可能为零。如果存在这种可能,我们就需要处理这种错误。
2.由于存储空间的限制,要防止整数的溢出,导致无法预料的结果。一般的语言都无法捕获这种错误,我们需要对计算的中间结果以及最终结果做出有效的预测防止这种情况的发生。
3.由于float类型是一个幂计算式,所以很多时候并不能表达一个精确值,例如0.1,如果使用float在内存中会被表示为0.10000000000000001,如果进行反复计算将会导致非常大的误差。浮点型不能精确表示所有的实数,所以尽量不要对浮点型使用 "=="操作。例如下面的方法并不会返回true.
public static boolean compareFloatValue(){
float expectedValue = 1.0f;
float realValue =0.0f;
for (int i=0;i<10;i++) {
realValue +=0.1f;
}
return expectedValue==realValue;
}
4.避免数量级相差比较大的数做加减运算。观察下面的Java代码片段,输出的结果是1.0E7。
float larger =10000000.00000f;
float smaller =0.00001f;
System.out.print(larger+smaller);
5.把浮点变量变成整型来避免舍入误差。例如在处理价格问题时,正常的价格都是12.05和100.15等的形式,可以通过乘以一百变成一个整数的形式来存储和计算。
6、longNum1即使声明为long类型,但是由于没有在数字末尾加上L字符,所以编译器还是以默认的int类型进行存储,longNum2是正确的long类型的声明方式,longNum3由于长度已经超出int类型能够支持的长度,但是又没有在数字末尾加L字符编译器就报错了。
7、最后是三个特殊的浮点数值。
正无穷:Double.POSITIVE_INFINITY;负无穷:Double.NEGATIVE_INFINITY;NaN:Double.NaN;并且判断一个数字是否为NaN也应该采用下面的方式
if(Double.isNaN(Double.NaN)){
}