Java中的数据类型

java中的数据类型分为两种:

  • 一种是基本数据类型,有八个,分别是byte、short、int、long、char、boolean、double、float
  • 一种是引用数据类型,也就是我们通常所说的对象。

8大基本数据类型

java中的基本数据类型,可以分成四大类:

- 整型:byte、short、int、long
- 浮点型:double、float
- 字符型:char
- 布尔型:boolean

bit位

  • bit就是位,也叫比特位,是计算机表示数据的最小存储单位。
  • byte(B) 字节,1字节 = 8位,也就是 1byte = 8 bit = 1B;
  • B、KB、MB、GB、TB的换算单位是1024(2^10);
    • 1B = 8bit
    • 1KB = 1024B
    • 1MB = 1024KB
    • 1GB = 1024MB
    • 1TB = 1024GB

封装类

我们用代码来看下八种基本数据类型的二进制位数、最大范围,最小范围:

public static void main(String[] args) {
    // 二进制位数 SIZE  最大值 MAX_VALUE    最小值 MIN_VALUE

    System.out.println("byte 的二进制位数:  " + Byte.SIZE + ";      byte 的最小值:" + Byte.MIN_VALUE + ";       byte 的最大值:" + Byte.MAX_VALUE);
    System.out.println("short 的二进制位数: " + Short.SIZE + ";    short 的最小值:" + Short.MIN_VALUE + ";     short 的最大值:" + Short.MAX_VALUE);
    System.out.println("int 的二进制位数:   " + Integer.SIZE + ";    int 的最小值:" + Integer.MIN_VALUE + ";     int 的最大值:" + Integer.MAX_VALUE);
    System.out.println("long 的二进制位数:  " + Long.SIZE + ";      long 的最小值:" + Long.MIN_VALUE + ";       long 的最大值:" + Long.MAX_VALUE);
    System.out.println("float 的二进制位数: " + Float.SIZE + ";    float 的最小值:" + Float.MIN_VALUE + ";     float 的最大值:" + Float.MAX_VALUE);
    System.out.println("double 的二进制位数:" + Double.SIZE + ";  double 的最小值:" + Double.MIN_VALUE + ";   double 的最大值:" + Double.MAX_VALUE);
    System.out.println("char 的二进制位数:  " + Character.SIZE + "; char 的最小值:" + Character.MIN_VALUE + ";  char 的最大值:" + Character.MAX_VALUE);
}

============================================================================================================

byte 的二进制位数:   8;     byte 的最小值:-128;                  byte 的最大值:127
short 的二进制位数: 16;    short 的最小值:-32768;               short 的最大值:32767
int 的二进制位数:   32;      int 的最小值:-2147483648;            int 的最大值:2147483647
long 的二进制位数:  64;     long 的最小值:-9223372036854775808;  long 的最大值:9223372036854775807
float 的二进制位数: 32;    float 的最小值:1.4E-45;              float 的最大值:3.4028235E38
double 的二进制位数:64;   double 的最小值:4.9E-324;            double 的最大值:1.7976931348623157E308
char 的二进制位数:  16;     char 的最小值: ;                     char 的最大值:�

拓展:

float

最小值:1.4E-45,表示 1.4除以10的45次幂,
1.4E-45 = 1.4÷(10^45)=0.0000000000000000000000000000000000000000000014 。 

最大值:3.4028235E38,表示 3.4028235乘以10的38次幂
3.4028235E38=3.4028235×10^38=340282350000000000000000000000000000000 。

double也是这么看的,这样就能更清晰的看出浮点类型的范围有多大了!!!!

面试题:银行关于钱的业务怎么表示?

​ 很多新手在学习了java的基本数据类型后,第一反应就是使用浮点数float或double,因为我们平时使用手机支付比较多,或者查询银行余额的时候都会发现,他们显示的都是小数,取小数点后两位,也就是到几元几角几分,或者说是几点几几元。这样我们完全可以使用float或double来表示!!!

Everybody,No! No! No! 重要的事情说三遍!!! 千万不要尝试使用浮点数直接表示银行业务,这样你会被你的领导打屎的!这是为什么呢?下面我们来看一段代码:

代码1:
	float f1 = 1.1f;
	double d1 = 1.1;
	System.out.println(f1 == d1); // false

代码2:
	    float f1 = 1232343423453f;
        float d1 = f1 + 1;
        System.out.println(f1 == d1); // true

​ 代码1中,float类型的变量 f1的值是 1.1,double类型的变量d1的值也是1.1,按理说 1.1=1.1,那么 f1==d1应该是true才对,可恰恰相反,控制台输出的结果是false,这是为什么呢?

​ 同样的,代码2中,d1=f1+1,那么f1和d1肯定是不会相等的,但是控制台输出的确实true,这又是为什么呢?

​ 我们应该知道float是单精度,double是双精度,那么什么是单精度什么是双精度呢?

单精度和双精度是什么意思?

​ 我们先来看下单精度和双精度的格式:

  • 单精度浮点数:符号位占1bit,指数占8bit,小数部分占23bit。

  • 双精度浮点数:符号位占1bit,指数占11bit,小数部分占52bit;

​ 不管是float还是double,在计算机上的存储都遵循IEEE规范,使用的是二进制计数法,都包含三个部分:符号、指数、尾数(小数)部分。其中float单精度浮点数的符号、指数、尾数分别是1、8、23,double双精度浮点数分别是1、11、52.

​ 当float或double进行计算或比较时,他们都是计算的符合自己范围之内的二进制数,超出范围的二进制数会被忽略掉,虽然这点误差特别特别小,微乎其微,但却是确实存在的,这就导致出现了误差。所以请记住一句话:"千万不要使用浮点数进行比较运算!!!"

单精度和双精度的区别

  • 在内存中占有的字节数不同:单精度占4个字节32位,双精度占8个字节64位。
  • 有效位数不同:单精度有效位数(十进制的有效表达)是7 ~ 8位,双精度有效位数是 15 ~ 16位,这是由于编译器的不同导致的。
  • 能够表示的范围不同
  • 在程序中的处理速度不同:一般CPU处理单精度比处理双精度的浮点数要更快。

银行关于钱的业务怎么表示?

​ 前边说了这么多,现在我们应该知道,float和double是不能直接用于银行业务的,那么该怎么办呢?java为我们提供了 **BigDecimal ** 和 BigInteger 两个大数字(有效数字超过16位)的操作类,其中 BigInteger是用于大整数的处理类,而BigDecimal则是针对大浮点数的处理类。

银行关于钱的业务,我们使用 BigDecimal来表示!!!

关于 BigDecimal类,有时间再另起一篇去详细介绍,有兴趣的朋友可以自行去百度和API中现行了解下。