Jadi saya punya dua ganda, A dan B, dan saya perlu memeriksa apakah ≤ B dengan presisi epsilon yang diberikan. Jadi untuk memeriksa apakah A == B Saya perlu melakukan ini (A dan B adalah ganda, epsilon adalah ganda terakhir, dalam kasus saya ...

1
Cometay 6 April 2021, 01:09

3 jawaban

Jawaban Terbaik

Anda tidak ingin menulis, a < EPSILON+b, karena jika b besar, maka Anda mungkin memiliki b == EPSILON+b, dan kemudian a < EPSILON+b akan gagal jika a dan b persis sama.

(a-b) < EPSILON berfungsi.

Ketika membandingkan angka dengan "presisi epsilon" Anda mempertimbangkan angka sama jika mereka berada dalam epsilon, jadi "A

(a-b) <= -EPSILON

1
Matt Timmermans 5 April 2021, 22:36

Pembaruan: Posting ini salah, lihat komentar. Jawaban @MattTimmens sepertinya sah. (Saya masih harus memeriksa kasus sudut)

Untuk menghitung @MattTimmens ', jalankan kode itu:

    final double a = Double.MIN_VALUE;
    final double b = Double.MIN_VALUE + 0;
    final double c = Double.MIN_VALUE + 10;
    final double e = 0.001;
    System.out.println("Matches 1: " + ((a - b) < e));
    System.out.println("Matches 2: " + ((b - a) < e));
    System.out.println("Matches 3: " + ((a - c) < e));
    System.out.println("Matches 4: " + ((c - a) < e));

Pertandingan 3 memberikan hasil yang salah, sehingga jawabannya salah.

Yang lucu adalah dia berpikir tentang beragam angka besar, tetapi meninggalkan jumlah yang sangat kecil tanpa pengawasan.

0
JayC667 5 April 2021, 22:55

Jika Anda dapat menggunakan BigDecimal, maka gunakan, selain:

/**
  *@param precision number of decimal digits
  */
public static boolean areEqualDouble(double a, double b, int precision) {
   return Math.abs(a - b) <= Math.pow(10, -precision);
}
1
zazz 5 April 2021, 22:20