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的原因是浮点数精度问题,具体分析如下:

  1. 浮点数的二进制表示限制:
  • 十进制小数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
  1. 精度差异导致比较失败:
  • float(32位)和double(64位)的精度不同,即使它们在十进制中都表示0.1,但二进制存储值存在微小差异。
  • 直接使用==比较是,Java会严格检查两个值的二进制表示是否完全相同,因此结果为false
float d1 = 23231233212332f;
float d2 = d1 +1;
system.out.println(d1 == d2)//true

运行这段代码返回true的原因是浮点数精度限制导致无法表示两个相邻整数之间的差异。具体分析如下:

  1. 浮点数的精度限制:
  • float使用 IEEE 754 标准存储,包含 1 位符号位、8 位指数位和 23 位尾数位(有效数字约为 6-7 位十进制数)。
  • 当数值非常大时(如示例中的23231233212332f),有效数字的位数可能超过float的精度范围,导致舍入误差。
  1. 大数运算的舍入问题:
  • 数值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

所有字符本质还是数字

字符编码

  1. ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
  • 用7位二进制数表示一个字符,共可表示128个字符。
  • 包括控制字符(如换行、回车,0-31)和可打印字符(如大小写字母、数字、标点符号,32-127)。
  • 例如:字符A的编码是65(二进制01000001),字符a的编码是97(二进制0110001)
  1. Unicode(统一码/万国码)
  • 使用1-4个字节表示一个字符 U0000-UFFFF(16进制)。
  • 给全世界所有字符(包括文字、符号、表情等)分配唯一的编码。
  • 例如:"中"对应编号U+4E2D,"A"对应U+0041,"a"对应U+0061
//\u是转义字符
char c = '\u0061';
System.out.println(c);//输出结果为a
  1. 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!代码要精简
posted @ 2025-07-15 22:40  消消小潮乐  阅读(16)  评论(0)    收藏  举报