Java如何正確比較浮點數
阿新 • • 發佈:2021-12-20
public class FloatDemo { public static void main(String[] args) { double a = 0.1 * 3; double b = 0.3; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("======================"); compareDouble(a, b); System.out.println("======================"); String c = "2.0"; String d = "2.00"; compareBigDecimal(c, d); } // 浮點型的比較 public static void compareDouble(double a, double b) { /* 普通浮點數比較不要直接 == , 包裝浮點數比較也不要直接 equals 我們應該 定義一個精度誤差值,再結合 Math.abs()方法進行比較 */ System.out.println("a == b -> " + (a == b)); System.out.println("a.equals(b) -> " + (Double.valueOf(a).equals(Double.valueOf(b)))); final double DIFF = 0.0001; if (Math.abs(a - b) < DIFF) { System.out.println("a和b相等"); } else { System.out.println("a和b不相等"); } } //BigDecimal的比較 public static void compareBigDecimal(String x, String y) { /* 不要直接 equals,因為 equals() 方法會考慮位數. 如果數學值是相等,但是位數不同,也會返回false 使用BigDecimal類下的compareTo()方法 */ BigDecimal c = new BigDecimal(x); BigDecimal d = new BigDecimal(y); System.out.println("c.equals(d) -> " + c.equals(d)); boolean f = c.compareTo(d) == 0 ? true : false; System.out.println("c.compareTo(d) -> " + f); } }
小結: 在遇到浮點數的時候,千萬不要使用 == 操作符或者包裝型別的 equals() 來進行比較,因為有精度問題。要麼使用閾值(精度誤差值)來忽略舍入的問題,要麼使用 BigDecimal 來替代 double 或者 float。