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中现行了解下。