📅  最后修改于: 2023-12-03 15:02:02.918000             🧑  作者: Mango
在Java中,浮点数不支持精确的比较,因为浮点数被表示为二进制小数。这就导致了一些精度上的问题。比如以下代码:
double a = 1.0 - 0.9;
double b = 0.9 - 0.8;
System.out.println(a == b); // false
其余更为深入的介绍请查阅这篇介绍。
如果想要进行浮点数的比较,就需要使用 Java 中提供的 Double
类中的比较方法。这些方法包括以下四种:
| 方法名 | 描述 |
| ------ | ----------------------------------------------------- |
| isNaN()
| 检查某个数是否是 Not-a-Number(NaN) |
| isInfinite()
| 检查某个数是否是正无穷、负无穷或无穷大 |
| compareTo()
| 比较两个指定的 double 值 |
| equals()
| 检查这个 Double 对象是否与另一个 Double 对象相等 |
其中最常用的是 equals()
方法。示例如下:
double a = 1.0001;
double b = 1.0002;
double c = 1.0001;
Double aa = a;
Double bb = b;
Double cc = c;
// 浮点数比较
System.out.println(Double.compare(a, b)); // -1
System.out.println(Double.compare(a, c)); // 0
// Double对象比较
System.out.println(aa.equals(bb)); // false
System.out.println(aa.equals(cc)); // true
值得注意的是,使用 equals()
方法进行浮点数的比较也有可能存在误差。因此,在实际开发中,需要根据具体情况来选择合适的比较方法。
另外,在 JDK1.5 之后,Java 也提供了 BigDecimal
类,可以实现精确计算和比较。示例代码如下:
BigDecimal d1 = new BigDecimal("1.0001");
BigDecimal d2 = new BigDecimal("1.0002");
BigDecimal d3 = new BigDecimal("1.0001");
// 精确计算
System.out.println(d1.subtract(d3)); // 0.0000
System.out.println(d1.subtract(d2)); // -0.0001
// 精确比较
System.out.println(d1.compareTo(d2)); // -1
System.out.println(d1.compareTo(d3)); // 0
总之,在浮点数的处理中,需要注意精度问题,选择合适的比较方法,才能保证正确性。