一:结论:获取两个浮点数差值的绝对值,然后在某个精度范围内判断。
二:Why?
因为java底层存储浮点数类型的数据:是获取到一个接近这个浮点数的近似值进行存储的。
如下代码展示:
1.假设 8.1 / 3 = 2.7,然后将 2.7 赋值给变量 b。显然想法是错误的。
2.java底层并不是拿 8.1 / 3 的。而是拿着一个接近 8.1 的数值,进行计算。
8.1 有可能在底层是 8.000000091.
double b = 8.1 / 3;
System.out.println(b); // 2.6999999999999997
三:错误示范
double a = 2.7;
/**
* 因为计算机存储的小数都是近似值,带有精度的。
* 比如这里:我们看到的是 8.1 这个数,但是计算机在存储 8.1这个数的时候,要考虑到精度,
* 所以有可能存储在底层的 8.1 这个数就是接近 8.1 这个数的值。比如:8.100000002
* 那么计算机在拿 8.100000002 / 3 的时候,也就会出现像程序运行结果一样的数。
*/
double b = 8.1 / 3;
System.out.println(a); // 2.7
System.out.println(b); // 2.6999999999999997
/**
* 出于 浮点数在计算机底层存储的有可能不是我们肉眼所看到的这个数 的细节:
* 所以我们在判断浮点数是否相等的时候,不能直接判断这两个数是否相等
* (也就是不能在程序中使用 == 进行浮点数的判断)
*/
// 这样的比较方式是错误的。
if (a == b) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
四:正确示范
/**
* 那如何比较两个浮点数是否相等呢?
* 1.先获取到 2 个浮点数的差值
* 2.然后对这个 差值 取绝对值
* 3.最后根据给出的范围判断这两个数是否相等.(在本次测试中,这个范围是随便给出来的!)
*
*/
double a = 2.7;
double b = 8.1 / 3;
System.out.println(a - b);
// 4.440892098500626E-16(科学计数法:也就是这个数 / 10的16次方,小数点向左移动16位)
if (Math.abs(a - b) < 0.000000002) {
// 如果两个浮点数差值的绝对值小于这个范围(0.000000002),那么这两个数就是相等的
System.out.println("相等");
}