浮点数据的存储 精度丢失 字符与字符串类型数据 显示器显示数据的方法

本文探讨了浮点类型(float和double)在计算机中的存储结构,解释了精度丢失的原因,并介绍了如何通过BigDecimal避免这个问题。还讨论了char类型、ASCII码和Unicode编码,以及String的内部实现。最后提到显示器数据的存储方法,包括像素点的组成和编码表的发展背景。
摘要由CSDN通过智能技术生成

浮点类型

浮点类型分为floatdouble,数据以科学计数法的方式存储。

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码就可以进行引用存储,此时只需要再记录字符的坐标。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值