Java基础语法04:数据类型拓展
Java基础语法04:数据类型拓展
整数拓展
进制
- 二进制0b
- 十进制
- 八进制0
- 十六进制0x,由09和AF组成,F是15
int i = 0b10;//二进制0b,输出结果为2
int i1 = 10;
int i2 = 010;//八进制0,输出结果为8
int i3 = 0x10;//16进制0x,输出结果为16
浮点数拓展
float f = 0.1f;//0.1
double d = 1.0/10;//0.1
system.out.println(f == d)//false
运行这段代码返回false的原因是浮点数精度问题,具体分析如下:
- 浮点数的二进制表示限制:
- 十进制小数
0.1无法被二进制精确表示,就像十进制无法精确表示1/3(0.333...)一样。 float f = 0.1f存储的是最接近0.1的32位浮点数,约为0.100000001490116119384765625。double d = 1.0/10存储的是最接近0.1的64位浮点数,约为0.100000000000000055511151231257827021181583404541015625。
- 精度差异导致比较失败:
float(32位)和double(64位)的精度不同,即使它们在十进制中都表示0.1,但二进制存储值存在微小差异。- 直接使用
==比较是,Java会严格检查两个值的二进制表示是否完全相同,因此结果为false。
float d1 = 23231233212332f;
float d2 = d1 +1;
system.out.println(d1 == d2)//true
运行这段代码返回true的原因是浮点数精度限制导致无法表示两个相邻整数之间的差异。具体分析如下:
- 浮点数的精度限制:
float使用 IEEE 754 标准存储,包含 1 位符号位、8 位指数位和 23 位尾数位(有效数字约为 6-7 位十进制数)。- 当数值非常大时(如示例中的
23231233212332f),有效数字的位数可能超过float的精度范围,导致舍入误差。
- 大数运算的舍入问题:
- 数值
23231233212332超过了float的精确表示范围(约 ±1.67×10^38),此时float只能存储近似值。 - 当执行
d1 + 1时,由于d1的近似值与真实值存在微小差异,加上 1 后的结果可能仍落在同一个float可表示的区间内,导致d2的存储值与d1完全相同。
最好完全避免使用浮点数进行比较
银行业务用Bigdecimal(数学工具类)表示
字符拓展
char c1 = 'a';
char c2 = '中';
System.out.println(c1);//a
System.out.println((int)c1);//强制转换,输出结果为97
System.out.println(c2);//中
System.out.println((int)c2);//强制转换,输出结果为20013
所有字符本质还是数字
字符编码
- ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
- 用7位二进制数表示一个字符,共可表示128个字符。
- 包括控制字符(如换行、回车,0-31)和可打印字符(如大小写字母、数字、标点符号,32-127)。
- 例如:字符A的编码是65(二进制
01000001),字符a的编码是97(二进制0110001)
- Unicode(统一码/万国码)
- 使用1-4个字节表示一个字符 U0000-UFFFF(16进制)。
- 给全世界所有字符(包括文字、符号、表情等)分配唯一的编码。
- 例如:"中"对应编号
U+4E2D,"A"对应U+0041,"a"对应U+0061。
//\u是转义字符
char c = '\u0061';
System.out.println(c);//输出结果为a
- UTF-8
- 是Unicode的一种编码方案,负责将Unicode字符转换为可存储/传输的字节。
- 动态可变长度编码:使用1-4个字节表示一个字符。英文1字节,中文3字节,emoji4字节。
- 兼容ASCII,可变长度,节省空间。
- 例如:字符A的编码是65(二进制
01000001),字符a的编码是97(二进制0110001)
转义字符
- \t 制表符,相当于tab键,用于在文本中增加水平间距
- \n 换行
- \r 回车
- \f 换页
- \\ 表示反斜杠字符(\)
- ' 用于在字符串中表示单引号
- " 用于在字符串中表示双引号
- \b 退格(删除光标之前的一个字符)
- \0 空格
- \s 字符串
- \ddd 八进制字符
- \uxxxx 16进制Unicode字符
布尔值拓展
boolean flag = true;
if(flag==true){}//新手
if(flag){}//老手
//Less is more!代码要精简

浙公网安备 33010602011771号