美文网首页
Java----数据类型解惑

Java----数据类型解惑

作者: 不过意局bugyj | 来源:发表于2018-10-24 14:47 被阅读0次

    最近的一次web作业充斥着数据的转换、进制的转换、位运算等,剪不断理还乱,最后绕到我没能完成任务,这算是吃了java基础不牢的亏,所以我打算搞下清楚,即解惑!

    数据类型

    java是一种强类型语言,意味着我们编程时必须为每一个变量声明一种类型!在java中一共有8中数据类型:4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char,以及表示真值的boolean类型!

    注:java有一个能够表示任意精度的算术包,通常被称为“大数值(big number)”,虽然如此,其也不是一个数据类型,而是一个java类对象而已!

    整型

    类型 存储需求 取值范围 注释
    byte 1字节 -128 ~ 127 共255个数,占8位即2^8个
    short 2字节 -32_768(-2^15)~ 32_767(2^15-1) 共65536个数,占16位即2^16个,和byte都不常用志在一些特定的场合
    int 4字节 -2_147_483_648(-2^31) ~ 2_147_483_647(21亿多即2^31)-1) 占4*8位表示数2^32个,默认没有小数点的较小的(不超过int范围)数都为int类型。最常用
    long 8字节 -9_223_372_036_854_775_808(92亿亿多即-2^63)~ 9_223_372_036_854_775_807(2^63-1) int虽最常用,但当数值过大时比如表示这个星球人数时,就要用到long类型,表示一个数为long类型时,在数值后面加上L(l也行,但其容易与‘1’混淆)来加以区别!

    注:

    • java没有任何无符号(unsigned)类型。
    • 十六进制数值有一个0x(零X),八进制有前缀0(零),但其容易与其他数值中的0混淆,所以最好不要使用八进制,二进制前缀为0b(零B)。(进制转换后面再研究!)
    package com.company;
    
    public class Main {
    
        public static void main(String[] args) {
            int hex = 0x16;
            int dec = 10;
            int oct = 0122;
            int bin = 0b10110;
            System.out.println("16进制:" + hex);//16进制:22
            System.out.println("10进制:" + dec);//10进制:10
            System.out.println("8进制:" + oct);//8进制:82
            System.out.println("2进制:" + bin);//2进制:22
    
        }
    }
    
    
    • java7后可以用下划线'_'作为分隔符来分割大数,使得数值更具易读性!(也适用于浮点数)
    public class Main {
    
        public static void main(String[] args) {
            int t = 1_441_456;
            double s = 1.441_456_2;
            System.out.println(t);//1441456
            System.out.println(s);//1
        }
    }
    

    浮点类型

    类型 存储需求 取值范围 注释
    float 4字节 约±3.402 823 47E+38 F(有效位数6~7) 不常用
    double 8字节 约±1.797 693 134 862 315 70E +308(有效位数15) 常用,没有后缀f(F)的小数默认为double

    注:

    • double的数值精度是float的两倍(称之为双精度类型),因为float的数值精度很难满足需求,所以不常用,绝大部分程序用的double
    • 若要声明一个带小数点的数为float,在其后面加上f或F即可(如3.14F或3.14f)!
    • 为何称其为浮点数呢?
      答:因为这些数都是以科学计数法形式进行内部存储的,当一个如500.314的数转为科学计数法形式为5.0314E^+2,他的小数点移动(浮动)到一个新的位置。
    • 所有浮点数的计算都符合IEEE 754的标准,下面是表示移除或出错情况的三个浮点数值:
      • 正无穷大
      • 负无穷大
      • NaN(不是一个数字)
        常量Double.POSITIVE_INFINiTE、Double.NEGATIVE_INFINiTE、Double.NaN分别表示了这三个数,不常用。但要注意不能用x == Double.NaN来判断是否相等(其他两个可以,也可以用方法),而是用Double.isNaN()
    package com.company;
    
    public class Main {
    
        public static void main(String[] args) {
            System.out.println("1.0 / 0 = " + 1.0 / 0);
            System.out.println("1 / 0.0 = " + 1 / 0.0);
            System.out.println("-1 / 0.0 = " + -1 / 0.0);
            System.out.println("1 / -0.0 = " + 1 / -0.0);
            System.out.println("0 / 0.0 = " + 0 / 0.0);
            System.out.println("Double.NEGATIVE_INFINITY = " + Double.NEGATIVE_INFINITY);
            System.out.println("Double.POSITIVE_INFINITY = " + Double.POSITIVE_INFINITY);
            System.out.println("is 1.0 / 0 infinite true:" + Double.isInfinite(1.0 / 0));
            System.out.println("is 1.0 / 0 finite true:" + Double.isFinite(1.0 / 0));
            System.out.println("is 0.0 / 0.0 NaN true:" + Double.isNaN(0.0 / 0));
            System.out.println(1.0/0 == Double.POSITIVE_INFINITY);
    
        }
    }
    
    

    结果:

    1 / 0.0 = Infinity
    -1 / 0.0 = -Infinity
    1 / -0.0 = -Infinity
    0 / 0.0 = NaN
    Double.NEGATIVE_INFINITY = -Infinity
    Double.POSITIVE_INFINITY = Infinity
    is 1.0 / 0 infinite true:true
    is 1.0 / 0 finite true:false
    is 0.0 / 0.0 NaN true:true
    true
    

    警告:不能在禁止出现误差的地方使用浮点数,因为浮点数不想存储方式不像整形那样使用每个二进制位精确地保存数值,而是如此文章(感觉十进制浮点数存储的过程也能很好解释为什么其叫做浮点数)和此文章所说那样,这种方式的存储不能保证精度准确,所以我们在日常编程中,可以使用BigDecimal类才能实现没有舍入误差!

    我觉得有必要提的就是在0.1到0.9这9个小数中,能准确表示的的就只有0.5了。对,甚至是0.1都不能表示。因为按照前面推荐文章中十进制小数转二进制的方法,会出现:
    (1) 0.1 x 2 = 0.2 取整数位 0 得 0.0
    (2) 0.2 x 2 = 0.4 取整数位 0 得 0.00
    (3) 0.4 x 2 = 0.8 取整数位 0 得 0.000
    (4) 0.8 x 2 = 1.6 取整数位 1 得 0.0001
    (5) 0.6 x 2 = 0.2 取整数位 1 得 0.00011
    (6) 0.2 x 2 = 0.4 取整数位 0 得 0.000110
    (7) 0.4 x 2 = 0.8 取整数位 0 得 0.0001100
    (8) 0.8 x 2 = 1.6 取整数位 1 得 0.00011001
    (9) 0.6 x 2 = 1.2 取整数位 1 得 0.000110011
    (n) ...
    会无限循环下去,浮点类型的精度也就那么多,再表示也只是个大概值,所以类似于0.3、0.7、0.9都会转换成小数部分为偶数的结果,二进制表示也就无限循环了。而0.5,在乘以2后小数部分就是0了,也就结束了!
    试着打印浮点的结果验证下:
    System.out.println(2.0 - 1.1);//结果为0.8999999999999999

    char类型

    前面说过了char是用来表示Unicode编码字符常量的。只能表示单个字符,比如'A'常量的Unicode值为"\u0041"(其ASCii码表示为41,数值都是十六进制,区别是Unicode用2个字节而ASCii码用一个,前面不足自动补0)可以用声明为char的变量表示。

    \u是表示Unicode的转义字符。

    boolean类型

    布尔类型占据一个字节,有两个值true和false,用来判断逻辑条件,整型值不能喝int类型相互转换!

    相关文章

      网友评论

          本文标题:Java----数据类型解惑

          本文链接:https://www.haomeiwen.com/subject/wsnkzftx.html