Coursera 算法课中有一份材料(FAQ第八个问题)提到了该课程项目中可以直接比较浮点数,具体情况这样的:
输入的整数a
和b
的取值范围为[-32,767, 32,767]
,直接比较浮点数a1/b1
与a2/b2
能够得出正确的答案。原因是IEEE-754规定了浮点数预算的结果使用临近值表示。
但我还是不大清楚,为什么使用临近值表示运算结果就能够直接比较?虽然直接比较浮点数不是一个好习惯,但是还是想请问什么情况下能够直接比较浮点数?
Coursera 算法课中有一份材料(FAQ第八个问题)提到了该课程项目中可以直接比较浮点数,具体情况这样的:
输入的整数a
和b
的取值范围为[-32,767, 32,767]
,直接比较浮点数a1/b1
与a2/b2
能够得出正确的答案。原因是IEEE-754规定了浮点数预算的结果使用临近值表示。
但我还是不大清楚,为什么使用临近值表示运算结果就能够直接比较?虽然直接比较浮点数不是一个好习惯,但是还是想请问什么情况下能够直接比较浮点数?
浮点数还分直接比较和间接比较?
比如这样,怎么比都相等:
Float f1 = 0.01f;
Float f2 = 0.09f;
Float f3 = 0.1f;
System.out.println(f3 == (f1 + f2)); // true
System.out.println(f3.compareTo(f1 + f2)); // 0
System.out.println(f3.equals(f1 + f2)); // true
再换成Double,怎么比都不相等:
Double d1 = 0.01d;
Double d2 = 0.09d;
Double d3 = 0.1d;
System.out.println(d3 == (d1 + d2)); // false
System.out.println(d3.compareTo(d1 + d2)); // -1
System.out.println(d3.equals(d1 + d2)); // false
System.out.println(Math.abs(d3 - (d1 + d2)) < Double.MIN_EXPONENT); // false
8 回答6.4k 阅读
1 回答4.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
因为这个范围内的任何两个数相除得到的结果中,误差最小的也比浮点数的精度要大。