今天发现一个有趣的java基础题
System.out.println(1.0-0.8);
答案不是0.2
而是0.19999999999999996
去网上查阅:java遵循IEEE 754浮点数运算,是使用分数来表示的
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else{
System.out.println((a + b + c));
System.out.println("不等于");
}
答案:不等于
结论:如果要求精确度,那就要小心使用浮点数,而且尽量 别用==来直接比较浮点数运算结果
如果解决呢?
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.1");
BigDecimal c = new BigDecimal("0.1");
BigDecimal result = new BigDecimal("0.3");
if(a.add(b).add(c).equals(result)){
System.out.println("等于");
}else{
System.out.println("不等");
}
java.math.BigDecimal类提供有plus(),substract(),multiply(),divide()等方法加减乘除
这几个方法返回都是BigDecimal
注意java中的 ==是用在比较两个参考名称是否参考同一个对象,言外之意,就是是否名称指向的同片内存
equal()方法,则是指两个对象实际指向的内存的值是否相同
二,基本类型的打包器
Long, Integer,Double, Float,Boolean等就是所谓的打包器(Wrapper)
作用:就是讲基本的数据类型打包在对象中,这样就把基本数据类型当做了对象类操作了
int a = 10;
System.out.println(a/3);
结果为:3
原因:如果表达式中都是int类型,就只会在int空间中做运算
Integer aa = new Integer(a);
System.out.println(aa.doubleValue()/3);
答案:3.3333333333333335
三,自动装箱,拆箱
Autoboxing
例如:Integer a = 10;编译程序会自动判断是否能进行自动装箱
使用一般化的Number类自动装箱
Number num = 3.14f;
分析:3.14会先被自动装箱为Float,
自动拆箱(Auto unboxing)---也就是自动取出打包器中的基本形态信息
数组
遍历二维数组方法
int[][] cords = {{1,3,5},{2,4,6}};
for(int i=0;i<cords.length;i++){
for(int j=0;j<cords[i].length;j++){
System.out.print(cords[i][j]+" ");
}
System.out.println();
}
System.out.println("************");
for(int[] row : cords){
for(int value : row){
System.out.printf("%2d",value);
}
System.out.println();
}
int[] a = {1,3,5}; 这种方法建立数组,是事先知道了数组的元素值,如果事先不知道数组的元素值,只知道数组的元素个数,那么可以使用new关键
字指定数组的长度来建立数组了
int[] a = new int[10];
java中new关键字就是建立对象,也代表了数组就是对象,这样每个索引的元素有默认值
默认值为0,
注意可以使用java.util.Arrays的fill()方法来设定默认值
例如:
int[] a = new int[10];
for(int i=0;i<a.length;i++){
System.out.printf("%5d",a[i]);
}
System.out.println();
System.out.println("************");
Arrays.fill(a, 20);
for(int i : a){
System.out.printf("%5d",i);
}
关于类类型建立的数组
Integer[] a = new Integer[10];
这个每个索引指向的为空null
Integer[] a = {1,2,3}; 可以自动装箱来完成初始化
数组的复制
当我们了解了数组是对象,就知道了
int[] a={1,2,3};
int[] b = a;
这个不是数组的复制,指向了同一片内存
那么如何数组复制呢? 做法:建立一个新的数组
int[] a = {1,2,3};
int[] b = new int[a.length];
for(int i=0;i<a.length;i++){
b[i] = a[i];
}
实际上jdk提供了System.arraycopy()方法来专门实现数组复制,比自己使用循环来的快的多:
int[] a = {1,2,3};
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
如果是jdk6以上也可以用:Arrays.copyof()
int[] a = {1,2,3};
int[] b = Arrays.copyOf(a, a.length);
我们知道在java中,数组 一旦建立后,长度就固定了,那么如果事先建立的数组的长度不够了怎么办呢?那么我们只有建立一个新的数组,将原来的数组拷贝到新的数据里“
int[] a = {1,2,3};
int[] b = Arrays.copyOf(a,a.length*2);
相当于把原来的数组的长度扩大了一倍