读Think Java的记录

计算浮点型数据时,会出现舍入误差

例如如下的例子

1
2
System.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
2
1.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);
//输出为Hello12

Java按照从左到右的顺序执行这些运算,所以第一条语句先执行1+2的数学运算,而后再进行字符串拼接
当然实际的使用中,遇到不明确的优先级,直接使用括号进行隔离

Scanner出人意料的行为

例如有如下代码段

1
2
3
4
5
System.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
5
System.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
Author: Sean
Link: https://blog.whileaway.io/posts/50844/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.