疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

浮点型-基本数据类型—[疯狂java讲义]


 

浮点型
        Java的浮点类型有2种:float和double,Java的浮点类型有固定的表数范围和字段长度,Java的浮点类型的字段长度和表数范围和机器无关。Java的浮点数遵循IEEE754标准,采用二进制数据的科学计数法来表示浮点数,对于float型数值,第一位是符号位,接下来8位表示指数,接下来的23位表示尾数;对于double型数值,第一位也是符号位,接下来的11位表示指数,接下来的52位表示尾数。
        注意:因为Java浮点数使用二进制数据的科学计数法来表示浮点数,因此可能不能精确标识一个浮点数,例如我们把5.2345556f值赋给一个float类型的变量,接着输出这个变量时看到这个变量的值已经发生了改变。如果使用double类型的浮点数则比float类型的浮点数更精确,但如果浮点数的精度足够高(小数点后的数字很多时),依然可能发生这种情况。如果开发者需要精确保存一个浮点数,可以考虑使用BigDecimal类。
        double类型代表双精度浮点数,float代表单精度浮点数。一个double类型的数值占8个字节,64位,一个float类型的数值占4个字节,32位。
        Java语言的浮点数有两种表示形式。
        1、十进制数形式:这种形式就是平常简单的浮点数,例如5.12, 512.0, .512。浮点数必须包含一个小数点,否则会被当成int类型处理。
        2、科学计数法形式:例如5.12e2(即5*102),5.12E2(也是5*102)。
        必须指出的是,只有浮点类型的数值才可以使用科学计数形式表示。例如51200是一个int类型的值,但512E2则是浮点型的值。
        Java语言的浮点型默认是double型,如果希望Java把一个浮点型值当成float处理,应该在这个浮点型值后紧跟f或F。例如:5.12代表的是一个double型的常量,它占64位的内存空间;5.12f或者5.12F才表示一个float型的常量,占32位的内存空间。当然,也可以在一个浮点数后添加d或D后缀,强制指定是double类型,但通常没必要。
        除此之外,Java还提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。例如使用一个正数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大,0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或Float的POSITIVE INFINITY表示;负无穷大通过Double或Float的NEGATIVE INFINITY表示,非数通过Double或Float的NaN表示。
        必须指出的是:所有正无穷大数值都是相等,所有负无穷大数值都是相等;而NaN不与任何数值相等,甚至和NaN都不相等。
        注意:只有浮点数除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整数值除以0,则会抛出一个异:ArithmeticException: / by zero(除以。异常)。
    下面程序示范了上面介绍的关于浮点数的各个知识点。
    程序清单:codes/03/3-4/TestFloat.java
    public class TestFloat
    {
    public static void main(String[] args)
    {
    float af=5.2345556f;
    //下面将看到af的值已经发生了改变
    System.out.println(af);
    double a=0.0;
    double c=Double.NEGATIVE_INFINITY;
    float d=Float.NEGATIVE_INFINITY;
    //看到float和double的负无穷大是想到的。
    System.out.println(c==d);
    //0.0除以0.0将出现非数
    System.out.println(a/a);
    //两个非数之间是不相等的
    System.out.println(a/a==Float.NaN);
    //所有正无穷大都是相等的
    System.out.println(6.0/0==555.0/0);
    //负数除以0.0得到负无穷大
    System.out.println(-8/a);
    //下面代码将抛出除以0的异常
    //System.out.println(0/0);
    }(未完.摘自[疯狂java讲义].李刚)