计算浮点型数据时,会出现舍入误差
例如如下的例子1
2System.out.println(0.1 * 10);
System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
输出的结果是1
21.0
0.9999999999999999
出现的原因是0.1在十进制中是有限小数,但是在二进制中是循环小数,所以浮点数的表示只是近似的,累加过程中逐渐积累舍入误差
解决方式在金额计算中使用将目标树乘以100的方式进行计算,计算完毕后再除以100,若需要对浮点数进行比较,应该使用如下代码
1
2
3 例如:
if(d == 1.23) (✗)
if(Math.abs(d - 1.23) < 0.000001) (✓)字符串运算符
1
2
3
4 System.out.println(1 + 2 + "Hello");
//输出为3Hello
System.out.println("Hello" + 1 + 2);
//输出为Hello12Java按照从左到右的顺序执行这些运算,所以第一条语句先执行1+2的数学运算,而后再进行字符串拼接
当然实际的使用中,遇到不明确的优先级,直接使用括号进行隔离
Scanner出人意料的行为
例如有如下代码段1
2
3
4
5System.out.println("What is your name?");
String name = in.nextLine();
System.out.println("What is your age?");
int age = in.nextInt();
System.out.printf("Hello %s, age %d \n", name, age);
其输出的结果可能是这样
Hello Sean, age 3
但是我们先进行读取年龄时1
2
3
4
5System.out.println("What is your age?");
int age = in.nextInt();
System.out.println("What is your name?");
String name = in.nextLine();
System.out.printf("Hello %s, age %d \n", name, age);
Hello , age 3
输入的”字符流”: 3\nSean\n
Scanner获取的是”字符流”,使用nextInt时,会读取字符直到遇到非数字的字符串。此时nextInt获取的是3,之后调用的nextLine,这个方法会读取字符直到遇到换行符(\n),因为此时数字后就是换行符,所以直接返回空字符串(“”).
解决这个问题的方式可以在读取完数字后,再调用一次nextLine函数
德·摩根定律(De Morgan’s laws)
- !(A && B) <=> !A || !B
- !(A || B) <=> !A && !B