浮点类型
浮点类型分为float和double,数据以科学计数法的方式存储。
float(单精度类型):大小为32bit,其中1bit表示符号位(即数值的正负,0代表正数,1代表负数),8bit表示阶位(即小数点的位置,用移码的形式表示),23bit表示数值位(即数值,用补码的形式表示)。
double(双精度类型):大小为64bit,其中1bit表示符号位,11位表示阶位,52bit表示数值位。
精度丢失
当我们在使用浮点数存储数据时,往往会存在精度丢失。
如上图所示,1.2 - 1 的结果并不是0.2而是0.199999... 输出结果与我们预期不同,这样的现象就是精度丢失。想要知道为什么在这里出现了精度丢失,就需要了解1.2 - 1 = 0.2→在计算机中怎样被存储。
我们在计算时是十进制计算,但是计算的结果是二进制存储的。例如十进制的0.2,当我们将其转换成二进制时,得到的结果是001100110011...这样一个无限循环的数。而double的位数是有限的,当一个无限循环的0011到达double的上限时,double将会自动把多余的部分裁去,因此会产生精度丢失的情况。
(0.2从十进制转换成二进制的过程)
精度丢失存在的原因
(1)小数在被无限地进行拆分,无法被完全表示,任何一种进制都有自己无法表示的小数。
(2)在两种进制进行转制的过程中,也有可能造成精度丢失。
如何解决无法存储精确小数的问题
可以通过BigDecimal的方式存储小数,BigDecimal的存储方式是将数据以字符串的形式存储。
import java.math.BigDecimal;
public class JingDu{
public static void main(String[]args){
BigDecimal b1=new BigDecimal(Double.toString(1.2));
BigDecimal b2=new BigDecimal(Double.toString(1));
double d=b1.subtract(b2).doubleValue();
System.out.println("d="+d);
}
}
char类型
char类型本身是16位无符号的整数,占用16bit内存空间,只能用于表示一个字符。
ASCII码
任何一个字符想要被存储,都要查阅ASCII码表,找到对应的ASCII码并将其转换成相应的二进制。
(字符和ASCII码转换的示例)
而java字符采用的是Unicode编码表,不使用ASCII码,一个字符16bit。
String字符串
String字符串底层是由char类型的数组组成的,在之后的学习中会更加深入了解。
显示器显示数据的方法
计算机存储的信息
计算机存储的信息一般分为:视觉信息、听觉信息。
视觉信息:颜色、亮度、坐标。
听觉信息:音色、振幅、时间间隔。
像素点的组成
颜色:光学三原色 红绿蓝(每一种颜色范围的都是0-255,用byte形式分别存储三原色的数值,一共24bit);
坐标:相对于左上角的x,y轴(用2个short类型分别存储x和y的数值,一共32bit);
亮度:由颜色进行决定;
结论:我们需要56bit就能记录一个像素点的情况。
编码表的诞生
平均一个图像大概有200个像素点,此时我们记录一个图形(文字)平均需要200*56bit=11200bit。
如果不对字符存储形式进行简化,则每一个字符的存储都需要占用大量的空间。
因此,为了简化每一个字符存储所占用的空间,人们发明了编码表:ASCII。
相当于为每一个字符设置了一个模板,只需要通过输入ASCII码就可以进行引用存储,此时只需要再记录字符的坐标。