Rumah  >  Artikel  >  Java  >  Ralat pembulatan dalam Java

Ralat pembulatan dalam Java

WBOY
WBOYke hadapan
2023-08-19 15:05:18596semak imbas

Ralat pembulatan dalam Java

Semasa menulis kod, kita semua melakukan pelbagai kesilapan yang membawa kita kepada ralat seperti ralat limpahan dan ralat sintaks adalah salah satu ralat biasa yang mungkin mengakibatkan penyelesaian yang salah untuk masalah matematik yang diberikan ralat berlaku apabila kita bekerja dengan nombor titik terapung.

Dalam artikel ini, kami akan meneroka punca masalah ini dan cuba mencari jalan untuk menghilangkan ralat ini.

Ralat pembulatan

Jenis Titik Terapung

Ia juga dipanggil nombor nyata dan digunakan apabila pengiraan memerlukan nilai pecahan. Ia mewakili nombor dengan titik perpuluhan. Sebagai contoh, untuk menyatakan hasil 1/5, iaitu 0.2, keputusan sinus dan kosinus juga memerlukan titik perpuluhan.

Di Jawa, terdapat dua jenis nombor titik terapung -

  • Titik terapung - Ia boleh menyimpan nilai ketepatan tunggal sehingga 32 bit. Kami mengisytiharkannya menggunakan kata kunci 'float'.

  • Double − Saiznya lebih besar daripada terapung dan boleh menyimpan nilai ketepatan berganda sehingga 64 bit. Ia diisytiharkan menggunakan kata kunci 'double'.

Mari kita bincangkan contoh di mana kita mungkin menghadapi ralat pembulatan dan kemudian kita akan memahami sebabnya dan memberikan penyelesaian untuk mengendalikannya dengan betul.

Contoh 1

public class Main{
   public static void main(String[] args) {
      double data1 = 0.30;
      double data2 = 0.20 + 0.10;
      System.out.println("Value after addition: " + data2);
      System.out.println(data1 == data2);
      double data3 = 0.50;
      double data4 = 0.10 + 0.10 + 0.10 + 0.10 + 0.10;
      System.out.println("Value after addition: " + data4);
      System.out.println(data3 == data4);
   }
} 

Output

Value after addition: 0.30000000000000004
false
Value after addition: 0.5
true

Dalam kod di atas, apabila kita menambahnya buat kali pertama, nilai jangkaan 'data2' ialah 0.30, tetapi hasil output adalah salah. Walau bagaimanapun, apabila kami melakukan operasi penambahan serupa yang lain, kami mendapat hasil yang tepat.

Mari kita ambil contoh lain yang menunjukkan ralat.

Terjemahan bahasa Cina bagi

Contoh 2

ialah:

Contoh 2

public class Main {
   public static void main(String[] args) {
      double data1 = 4.30452;
      double data2 = 0.503542;
      double res = data1 + data2;
      System.out.println("Value after addition: " + res);
   }
}

Output

Value after addition: 4.8080620000000005

Keluaran yang dijangkakan ialah 4.808062, tetapi kami mendapat output yang salah di sini.

Sebab kesilapan

'IEEE 754' ialah standard yang diikuti oleh Java semasa melaksanakan nombor titik terapung Menurut peraturan 'Pembulatan'nya, apabila daripada nilai mantissa lebih besar daripada 23 bit maka ia menambah 1 kepada bit ke-23 untuk membundarkan nilai. . Di sini, mantissa ialah perwakilan binari bagi digit pecahan.

Sebab itu kita dapat nilai yang berbeza.

Bagaimana untuk menyelesaikan ralat

Untuk mengelakkan ralat pembundaran ini, kami mempunyai kaedah berikut -

    . Ia boleh mengendalikan operasi ini dengan ketepatan yang tepat.
  • Contoh berikut menunjukkan cara kita boleh menggunakannya untuk menghasilkan keputusan yang tepat.

  • Contoh 3
import java.math.*;
public class Main{
   public static void main(String[] args) {
      BigDecimal data1 = new BigDecimal("0.20");
      BigDecimal data2 = new BigDecimal("0.10");
      BigDecimal res = data1.add(data2); // performing addition
      System.out.println("Value after addition: " + res);
   }
}

Output

Value after addition: 0.30

Dalam contoh 1, kami mendapat ralat semasa menambah dua nilai Dalam contoh di atas, kami menggunakan nilai yang sama tetapi kali ini kami mendapat hasil yang betul.

Math.round()
    − Ia ialah kaedah statik kelas 'Math'. Ia memerlukan nilai titik terapung sebagai hujah dan mengembalikan nilai integer terdekat. Kami memanggilnya menggunakan nama kelasnya.
  • Contoh di bawah menggambarkan penggunaannya dalam program.

  • Contoh 4
public class Main {
   public static void main(String[] args) {
      double data1 = 4.30452;
      double data2 = 0.503542;
      double res = data1 + data2;
      System.out.println("Value after addition: " + res);
      System.out.println("Value after rounding off the addition: " + Math.round(res));
   }
}

Output

Value after addition: 4.8080620000000005
Value after rounding off the addition: 5

Kesimpulan

Ralat pembulatan bukan masa kompilasi atau ralat masa jalan, pengkompil Java tidak dapat mengesannya Ini adalah sebab mengapa pengaturcara perlu memberi perhatian tambahan kepada ralat ini jika tidak, kita akan mendapat hasil yang salah Dalam artikel ini, kita telah membincangkannya sebabnya dan juga mencadangkan beberapa cara untuk mengatasi ralat pembulatan ini.

Atas ialah kandungan terperinci Ralat pembulatan dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam