JavaSE—数据类型转换、整数、浮点数、字符扩展
1.数据类型转换
long的数据是要加上后缀L或者l的,但是如果粗心大意忘记了呢?
可以看到是不会报错的,这是因为Java支持数据类型的转换。
那如果将一个long类型的数据赋值给int类型的数据,又会怎么样呢?
可以看到,现在是报错了的。
可以思考一下,long类型的精度是比int类型的要高的,一个低精度的数据向高精度的数据转换,最多就是数据末尾加几个不影响数据的0,而高精度的数据向低精度的数据转换的话,却有可能会丧失掉一部分的数据,这样就不难明白了。
那如果我不在意那点损失呢?
咦?可以发现这种流氓办法是可以的!
在Java中,数据范围小的向数据范围大的数据转换,叫自动类型转换,也叫隐式类型转换
数据范围大的向数据范围小的数据转换,叫强制类型转换,也叫显示类型转换,需要指定需要转换的数据类型
图源于网络:为自动类型转换,逆向即为强制类型转换
- 整数型向浮点型转换可以理解,char型向int类型转换会是什么结果呢?先留一个悬念,在文章后面的char类型扩展会提到。
2.数据类型知识点扩展
-
整型
我们日常生活中使用的是十进制数据,整十进一,但是还有二进制数据,八进制数据,十六进制数据,对应的也都是整二进一,整八进一,整十六进一,那在Java程序中怎么表示这些进制的数据呢?
二进制:0b开头
八进制:0开头
十进制:直接书写
十六机制:0x开头
public class DateTypeExtension { public static void main(String[] args) { //1.整数扩展 int num1 = 0b10; //二进制2 int num2 = 010; //八进制8 int num3 = 10; //十进制10 int num4 = 0x10; //十六进制16 System.out.println(num1); System.out.println(num2); System.out.println(num3); System.out.println(num4); } }
查看此时的允许结果:可以看到是正确的
-
浮点型
我们先来看一个有趣的东西,问你0.55-0.5等于多少,1秒钟你就能回答出0.05,但是程序的结果是0.05吗?
public class DateTypeExtension { public static void main(String[] args) { //2.浮点数扩展 double num1 = 0.55; double num2 = 0.5; double result = num1 - num2; System.out.println(result); } }
居然不是0.05!!!
这是因为啊,所有的数据在计算机中都是要转换成二进制的,但是浮点数的小数在转换的时候可能会存在舍入误差,这就导致结果也有误差(涉及到计算机组成原理知识,网上有很多关于Java浮点数计算误差的文章,本人水平尚有限,不能很好的解释,故不在此卖弄了~)
这如果是涉及到钱的话,要么是你不乐意,要么就是银行不乐意了,所以涉及到像金融行业这种对数据计算结果要求极高的,就不能使用浮点数进行运算,Java也考虑到了这一个问题,所以有BigDecimal这种能够保证数据计算结果的数学工具类。(尚未涉及到类的学习,有兴趣可先自行查阅~)
所以,最好完全避免使用浮点数进行运算比较
-
字符型
在上述数据类型转换中,我们留下了一个问题:char类型的数据向int类型的数据强制转换会怎么样呢?
public class DateTypeExtension { public static void main(String[] args) { //3.字符扩展 char c1 = 'a'; char c2 = '中'; System.out.println((int) c1); System.out.println((int) c2); } }
我们来看看结果:的确输出了两个int类型的数据
原来啊,所有字符的本质还是数字
因为char类型涉及到编码问题,有一种编码叫Unicode,它可以处理各种语言的文字,占两个字节。
所以就有一张Unicode表,一个数字对应一个字符,向上述的97就是a,20013就是中国的中。
如果不想直接写a呢,我们也可以使用转义来表示,其范围为:U000-UFFF(十六进制)
//\为转义字符,即\之后的内容会被转换成别的意义
char c3 = '\u0061';
System.out.println(c3);
可以看到结果是a,因为0061的十六进制代表97,而在编码表中,97对应的就是字母a,所以输出了a
其它的转义字符:
\t:代表一个tab键的作用
\n:相当于换行
......(常用为这两个,其余可需要的时候百度)
//println是输出完内容会自动换行的,print是不会的
System.out.print("hello");
System.out.print("\tworld");
System.out.print("\n! ");
结果验证了\t为一个tab的作用,而\n是可以换行的。
所以在涉及到 \ 时要注意转义的问题。