Java基础(2)
博客:深入理解浮点型数据、计算机视觉信息存储与类型转换
四、浮点型数据
在编程语言中,浮点型数据主要包括float(单精度)和double(双精度)。计算机默认使用double类型存储小数,这会引发一些特殊的问题。
1. 小数转化为二进制数
小数转化为二进制数的方法是乘二取整(从下往上读)。例如,0.2在二进制中是一个无限循环数,转换过程如下:
0.2 * 2 = 0.4 -> 0 0.4 * 2 = 0.8 -> 0 0.8 * 2 = 1.6 -> 1 0.6 * 2 = 1.2 -> 1 ...
转换结果为0.001100110011...,可以看到它是一个无限循环数。
2. 精度丢失问题
原因:由于计算机存储小数默认用double类型,而double类型的大小是固定的,对于一些无限循环小数无法完全精确存储,导致精度丢失。例如:
public static void main(String[] args){
System.out.println(1.2 -1);
}
输出结果为0.19999999999999996,并不是我们期望的0.2。
解决办法:可以使用BigDecimal类来处理精度问题:
public static void main(String[] args){
BigDecimal b1=new BigDecimal(Double.toString(1.2));
BigDecimal b2=new BigDecimal(Double.toString(1));
Double value =b1.subtract(b2).doubleValue();
System.out.println(value);
}
五、计算机显示器数据的存储方案
计算机存储信息分为两种方式:视觉信息(颜色、亮度、坐标)和听觉信息(音色、振幅、时间间隔)。
1. 视觉信息存储方式与问题
像素点:
显示器通过像素点显示图像,每个像素点由红、绿、蓝三原色构成,每个颜色的值范围为0~255。每个像素点需要3个字节(3Byte,24bit)。
坐标:
除了存储像素点的颜色值,计算机还需要记录像素点的坐标信息(x轴和y轴),每个坐标用两个short类型表示,总共4字节(32bit)。
存储问题:
单个像素点需要7字节(56bit)存储空间,对于高分辨率显示器,如2^16 x 2^16,存储数据量将非常庞大。
2. 减少视觉信息存储数据量的解决方案
字符集:
字符集通过映射的方式减少存储空间。例如,一个字符的像素点信息可能需要11200bit,但使用ASCII码映射后仅需8bit。
示例:
假设一个简单的映射表,存储三个字符abc只需24bit,而原始方式需要33600bit。
乱码问题:
当发送方和接收方使用不同字符集时,可能会导致乱码。例如:
原始数据:1010(高四位) 发送方:使用字符集A 接收方:使用字符集B
由于字符集不同,接收方可能无法正确解码数据,导致乱码现象。
六、char类型
1. char类型的基本概念
字符类型实际上是一个16位无符号整数,这个数对应字符的编码。Java中的字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位。
2. 示例代码
public static void main(String[] args) {
char c1 = '中';
char c2 = '\u4e2d';
System.out.println(c1);
System.out.println(c2);
}
注释:4e2d为中所对应的16位Unicode编码。
3. 字符与整数的转换
任何一个字符都可以转化为一个整数,范围是0-65535。
public static void main(String[] args) {
int a = '中';
System.out.println(a);
}
可以查看某个数对应的字符:
public static void main(String[] args) {
char c = 69;
System.out.println(c);//输出E
}
4. 转义字符
对于不方便输出的字符,可以使用转义字符表示。例如:
public static void main(String[] args) {
int num = 100;
String json = "{"+"\"count\":"+num+"}";// /斜杠 \反斜杠
String dataString = "[{\"id\":\"1\" ,\"name\":\"张三\"},{\"id\":\"2\" ,\"name\":\"李四\"},{\"id\":\"3\" ,\"name\":\"王五\"}]";
System.out.println(json);//输出{"count":100}
}
七、布尔类型
boolean类型有两个值:false和true,用于判断逻辑条件。数值型和boolean之间不能直接转换。
八、类型转换
1. 自动类型转换
类型范围小的变量可以直接赋值给类型范围大的变量。表达式的运算结果类型由表达式中最高类型决定。在表达式中,byte、short、char会直接转换成int类型进行运算。
例1:
public static void main(String[] args) {
byte a=127;
byte b=1;
System.out.println(a+b);//输出128
}
例2:
public static void main(String[] args) {
byte a=127;
int c=a;
System.out.println(c);//输出127
}
2. 强制类型转换
强制类型转换可能会导致精度丢失问题,因为计算机采用补码存储形式。
例1:
public static void main(String[] args) {
byte a=127;
byte b=1;
int c= (byte) (a+b);
System.out.println(c);//输出-128
}
例2:
public static void main(String[] args) {
int a=128;
int c= (byte) a;
System.out.println(c);//输出-128
}
通过本文,您可以深入了解浮点型数据、视觉信息存储以及Java中的类型转换,这些都是开发过程中经常遇到的重要概念。希望这些知识能帮助您更好地理解和解决实际开发中的问题。