Day5数据类型扩展知识
关于数据类型的拓展知识
- 二进制数是在数字前加上0b,八进制是加上0,十六进制是加上0x
public static void main(String[] args) {
//整数拓展 进制 二进制0b、八进制0、十六进制0x
int i = 10;
int i2 = 010;//八进制
int i3 = 0x10;//十六进制
System.out.println(i);
System.out.println(i2);
System.out.println(i3); = 10_0000_0000;//数字中可以用下划线分割
int years = 20
结果:
-
浮点数的拓展:
浮点数本身存在限额,且自带舍入误差,所以看上去相等其实不相等,看上去不等也许计算出会相等
如以下计算
float f =0.1f; double d = 1.0/10; //两者理应都是0.1 System.out.println(f==d);//显示false,证明并不相等,两个等号是计算相等 System.out.println(f); System.out.println(d); float d1 = 456564416516525f; float d2 = d1+1; System.out.println(d1==d2);//显示true
结果:
-
f=d显示false,虽然两者看起来都是0.1,但是这个实数却不是跟我们所想的计算一样,而是通过别的计算来获得一个近似的实数(具体的我也不是看得很懂所以就不写了),总之真实的数字不是像我们所看到的那样,隐藏的数字也因此获得了精度的限制,看起来都是0.1,但是其实float和double计算出了两个完全不同的数字,因此两者不会相等。
-
d1=d2,则是因为浮点数的离散和舍入误差的特征,虽然加了1,但是在后续的计算中又舍掉了,导致最后输出的依旧是这个值,而这里同处在一个数据类型下计算,所以不存在精度不同的问题。
-
综上所述,使用浮点数作比较会有诸多限制,所以,不如不用!
-
-
字符串的拓展,其实就是字符本身是Unicode的编码,占两个字节,且自身都有编号,在U0000-UFFFF之间,可以通过强制转换转换成数字:
char c1 = 'a'; char c2 = '中'; System.out.println(c1); System.out.println((int)c1);//强制转换 System.out.println(c2); System.out.println((int)c2);
结果:
即,“a”的值为97,而“中”的值为20013,此外宋的值是“23435”
-
java中存在转译字符,即使用特定字符表示符号如
//转译字符 // \t(空格) ---制表符 // \n(换行) //more... System.out.println("hello\nworld");
结果
-
布尔值中的拓展
在java的布尔值判断格式中
boolean flag = true; if (flag){} if (flag==true){}
两个if后面的代码是一模一样的,按时显然前者更精简,还是使用前一个比较好。
关于数据类型转换
java是强类型语言,必须保证数据类型相同才能进行下一步,因此会经常进行数据类型的转换
java中的数据类型存在高低之分
byte、short、char<int<long<float<double
可见位越多则越高,此外浮点数总是先于整数
1.数据转换的类型
java中主要有两种类型的数据转换
-
强制转换
即从高到低必须进行强制数据转换
public class demo1 { public static void main(String[] args) { int i = 126; byte b = ((byte)i);//byte最大到127,到128就会出问题,内存溢出 //强制转换是改变类型和变量名 System.out.println(i); System.out.println(b);
结果是
-
自动转换
即由低到高是自动转换,无需变化
public class demo1 { public static void main(String[] args) { int i = 126; double b = i;
结果为:
-
在强制转换中,如果超过限额,就会出现内存溢出情况,如上面的第一个byte的值大于127,则会出现错误,比如:
public class demo1 { public static void main(String[] args) { int i = 128; byte b = ((byte)i);
结果是:
2.数据转换的注意事项
-
无法对布尔值进行计算(true or false)
-
不能把对象类型转换为完全安全不相干的类型
-
在大容量向小容量转换时要强制转换
-
转换有可能出现内存溢出(上文提到)和小数点精度问题
如下面的案例
System.out.println((int)23.7);//double System.out.println((int)-45.89f);//float
结果为
-
此外字符也可以转换(本质上是编码)
如:
char c ='a'; int d = c+1; System.out.println(d); System.out.println((char)d);
结果为:
-
较大的数据转换要注意一些问题,我全写代码里了:
public class demo2 { public static void main(String[] args) { //操作较大的数字要注意内存溢出 int money = 10_0000_0000;//数字中可以用下划线分割(jdk7的新功能) int years = 20; int total = money*years; System.out.println(total); //输出了一个负数,证明内存溢出 //试试看long? long total2 = money*years; System.out.println(total2); //还是这个数字,因为两个int最后还int,在转换前就已经是错误数字,所以即便使用long也没有用 //尝试一下用类型转换解决这个问题 System.out.println("----------------------------"); long total3 = ((long)money)*years; long total4 = money*((long)years); System.out.println(total3); System.out.println(total4); //都显示出正常的数字,说明只要在过程中转换其中一个,就可以全部提升到long,解决极限问题 //尽量用大写的L,不然容易看成1
以上的输出结果为
ps:注意long中的L表示要用大写,不然容易看成1.