一.枚举类型
仔细阅读示例: EnumTest.java,运行它,分析运行结果?
代码如下:
`public class EnumTest {
public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;
//s和t引用同一个对象?
System.out.println(s==t);
//是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());
//从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true
//列出它的所有值
for(Size value:Size.values()){
System.out.println(value);
}
}
}
enum Size{SMALL,MEDIUM,LARGE};分析及结果如下:
enum Size{SMALL,MEDIUM,LARGE};此段代码定义了Size枚举;
Size s=Size.SMALL;
Size t=Size.LARGE;创建Size变量s,t;
//s和t引用同一个对象?
System.out.println(st); 比较变量s,t 结果:false 说明s和t引用的不是同一个对象
//是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());调用**Class**中的isPrimitive()方法判断枚举变量是否为原始数据类型。 结果:false 说明枚举变量不属于原始数据类型。 **补充:原始数据类型:指的是直接存储基本数据的数据类型(如:int,double),它们有固定的字节数,并且不是对象。**
//从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(su); //true此段代码根据枚举类型中的valueOf方法将字符串转换为枚举变量 结果:false 通过字符串转换得到的同值枚举变量与原创建的枚举变量是相同的。
//列出它的所有值
for(Size value:Size.values()){
System.out.println(value);
}`
结果如下:
SMALL
MEDIUM
LARGE
整段代码运行结果:
你能得到什么结论?你掌握了枚举类型的基本用法了吗?
结论一:枚举变量有其固定的值;
结论二:枚举类型不是原始数据类型
结论三:valueOf方法可以创建枚举变量
结论四:values方法可以遍历枚举类型
二.浮点数的精度问题
观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗?
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}
}
完整运行结果:
想不到吧,最后的运行结果居然是这样一堆奇奇怪怪的小数
解答:这是因为因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确表示。因此,直接运算可能会导致不精确的结果。
解决方法
这里给出三种简单的处理方法
方法一:四舍五入
使用Math.round()对结果进行四舍五入
以上述代码为例进行修改:
public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + Math.round((0.05 + 0.01)100.0)/100.0); System.out.println("1.0 - 0.42 = " + Math.round((1.0 - 0.42)100.0)/100.0); System.out.println("4.015 * 100 = " + Math.round((4.015 * 100)100.0)/100.0); System.out.println("123.3 / 100 = " + Math.round((123.3 / 100)1000.0)/1000.0); } }
结果如下图:
注意:直接使用Math.round时只保留整数
方法二:使用BigDecimal 类
`import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalRoundExample {
public static void main(String[] args) {
double num = 0.5 + 0.1;
BigDecimal bd = new BigDecimal(Double.toString(num));
BigDecimal x = bd.setScale(2, RoundingMode.HALF_UP);//2表示要保留的小数位数
System.out.println(x);
}
}
`
结果:
0.06
三.出四则运算题目
一家软件公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道四则运算题目给小学生做。
代码如下:
import java.util.;//导入java.util中的所有包
public class Mathtitle {
public static void main(String[] args) {
//输出30道题目
for(int i = 0;i<30;i++){
System.out.print(i+1+",");//去掉ln防止自动换行
getTitle();
}
}
public static void getTitle(){
//获取俩个随机数
Random random = new Random();
int r1 = 0, r2 = 0;
r1 = random.nextInt(100);
r2 = random.nextInt(100);
//定义一个包含四则运算符的数组
char[] arr = {'+','-','','/'};
//随机获取一个运算符
int num;
char operation;
num = random.nextInt(4);
//输出一道题目
System.out.println(r1+" "+arr[num]+" "+r2+" =");
}
}
运行结果:(每次结果随机)
1,50 - 16 =
2,32 / 9 =
3,76 - 20 =
4,91 - 26 =
5,51 * 73 =
6,66 + 4 =
7,78 + 34 =
8,64 + 80 =
9,71 * 53 =
10,61 - 28 =
11,14 + 62 =
12,93 - 93 =
13,69 / 19 =
14,46 - 23 =
15,52 - 92 =
16,83 / 89 =
17,21 - 98 =
18,24 + 77 =
19,0 + 22 =
20,72 - 2 =
21,71 * 83 =
22,70 + 93 =
23,35 + 80 =
24,21 * 54 =
25,25 / 69 =
26,93 / 30 =
27,57 * 73 =
28,5 + 83 =
29,81 / 10 =
30,0 / 81 =
进程已结束,退出代码为 0
四.+在Java中的使用
阅读以下代码,输出结果是什么?
`public class Test {
public static void main(String[] args) {
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
}
}`
运行结果:
为什么会有这样的输出结果?
这是因为在System.out.println()语句中‘+’有连接作用和作为运算符俩种作用,根据前后的内容会有不同的用法。
对于System.out.println("X+Y="+X+Y);
‘"X+Y="’是一个字符串,后面的+号会直接将这个字符串与后面的数据连接,当计算机编译到下一个加号时X已经当作数据输出了,这时+号仍然会默认为连接符,直接紧随其后打印出Y的值。
而对于System.out.println(X+Y+"=X+Y");
先执行‘X+Y’,因为加号前后都是数据,这时便会直接计算X+Y,之后的加号继续起连接作用输出=X+Y。