整数拓展
- 进制:在平时咱们生活中经常见到的例如通用于电脑识别的二进制、咱们生活中常用的十进制、工作中常见的八进制与十六进制。
- 二进制:通常会以0b开头
- 十进制:咱们生活中的数字
- 八进制:通常以0开头
- 十六进制:通常以0x开头
浮点数拓展 (float、double)
-
试题举例
-
银行业务中‘钱’的表示方式
-
在银行处理业务时,钱肯定是不能给算错的,那么当我们在同时使用使用float与double时是存在问题的
例如我们使用一下两种浮点数类型去做比较时
我们来看它的比较结果
咱们再次使用同类型浮点数进行对比
我们再来看一下它们的对比结果
这个时候是不是很多同学很奇怪,为什么上面的本该打印出true的却打印出false,而本该打印出false的却反而打印出true呢?
- 其实呢,咱们float类型的浮点数它能表现的字长是限的,但是咱们知道,有些东西它们得出来可以是无限的。可是呢,他是有限的,也是离散的。它们是有这样一个区别的,浮点数都会存在一个舍入误差的东西,咱们都知道它会四舍五入,但由于很多数字没办法精确的表示,结果只能是一个大约数。咱们小学都学过约等于,它只是接近但是不等于,所以它们在比较中是有问题的。由此,可以得出一个结论:最好完全避免使用浮点数进行比较
-
那么回到咱们原本的问题:银行业务中‘钱’怎么表示呢?
由上我们已经知道,我们不使用浮点数去比较,那么我们还可以使用一个类去比较。咱们先记住这个类,它的名字叫做BigDecimaL (数学工具类、大数类型)。咱们Java里面会有很多很多这样自定义好的类,咱们都可以拿来使用。咱们只需要知道,银行业务不能使用float来表示了,我们只需要使用BigDecimaL这个类来表示 (如果你需要计算且不能有误差,咱们就可以使用咱们Java写好的类BigDecimaL就可以了)
-
-
字符拓展
-
咱们先来输入一段代码
咱们可以看到图中c1和c2的第二段打印代码前面都有一个'(int)',它是用来给咱们的字符强制转换为int类型 (并不是所有东西都可以强制转换的,但是这里是可以的),咱们先来看一下打印结果
咱们可以看到,图中打印出的a和中都没有问题,但是97和20013这两串数字是什么东西呢?他就是咱们使用int强制转换得出的结果,所以我们可以得出一个结论:所有的字符本质还是数字
-
关于Unicode
-
由上我们通过单引号('a'或'中')来表示字符常量没有任何问题,但是这个char类型它会涉及到一个编码问题,它就是Unicode编码,它的作用是处理各种语言的文字,在字节表示中占用了2个字节,在早些年的时候它最终可以表示0~65536个字符,现在的话可以表示的字符更多了。相信大家都知道Excel表格,它最长只有2的16次方,既是65536
-
为什么说所有的字符本质还是数字呢?是这样的,字符的本身是数字通过char变成了各种字符,因为在Unicode中有一个编码表,在这个表中,有很多数字例如数字1等于某个字符,咱们上图打印中97等于a、20013等于中,在Unicode内正是这么表示的。如下图
打印如下
因此,在Unicode表中65代表大写A,无论是转换与否,它都会去查这样一张表,这个表内有非常多的东西包括我们的中文,因此字符本质上还是数字
-
-
Unicode转译
-
由上得知,所有字符都会通过一个Unicode编码进行表示,而它们是怎么表示的?
举例一个格式:U0000~UFFFF,这是它的区间范围。咱们来打印一个字符方便大家去理解,如下图
打印如下
- 这时候就会有人问了,a的转译表示为什么不是\u0097或者是\u97,而是出乎意料的\u0061呢?关于这个问题,咱们可以打开计算器计算一下97的十六进制编码是否就是0061,所以在Unicode中转译的进制编码为十六进制。
以上的底层原理大家了解一下就可以了,以防面试时被问到。实际使用中咱们只需要用到下图表示即可
-
-
常见转义字符
-
制表符 (\t)
-
换行符(\n)
-
...(以上只是举例,更多转义字符可以在网络中查到)