Java----数据类型解惑

2018-10-24  本文已影响0人  不过意局bugyj

最近的一次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’混淆)来加以区别!

注:

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

    }
}

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

注:

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类型相互转换!

上一篇下一篇

猜你喜欢

热点阅读