Cara Membulatkan Angka ke N Tempat Desimal di Jawa

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat cara membulatkan angka ke n tempat desimal di Jawa.

2. Angka Desimal di Jawa

Java menyediakan dua tipe primitif yang dapat digunakan untuk menyimpan bilangan desimal: float dan double . Double adalah tipe yang digunakan secara default:

double PI = 3.1415;

Namun, kedua jenis tersebut tidak boleh digunakan untuk nilai yang tepat , seperti mata uang. Untuk itu, dan juga untuk pembulatan, kita bisa menggunakan kelas BigDecimal .

3. Memformat Angka Desimal

Jika kita hanya ingin mencetak angka desimal dengan n digit setelah titik desimal, kita cukup memformat output String:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

Alternatifnya, kita dapat memformat nilai dengan kelas DecimalFormat :

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

DecimalFormat memungkinkan kita untuk secara eksplisit mengatur perilaku pembulatan, memberikan lebih banyak kontrol pada keluaran daripada String.format () yang digunakan di atas.

4. Pembulatan Ganda Dengan BigDecimal

Untuk membulatkan dobel s ke n tempat desimal, kita dapat menulis metode pembantu :

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

Ada satu hal penting yang harus diperhatikan dalam solusi ini - saat membuat BigDecimal ; kita harus selalu menggunakan konstruktor BigDecimal (String) . Ini mencegah masalah dengan merepresentasikan nilai yang tidak tepat.

Kita dapat mencapai hal yang sama dengan menggunakan pustaka Apache Commons Math:

 org.apache.commons commons-math3 3.5 

Versi terbaru dapat ditemukan di sini.

Setelah pustaka ditambahkan ke proyek, kita bisa menggunakan metode Precision.round () , yang menggunakan dua argumen - nilai dan skala:

Precision.round(PI, 3);

Secara default, metode ini menggunakan metode pembulatan HALF_UP yang sama dengan metode pembantu kami. Oleh karena itu, hasilnya harus sama.

Perhatikan bahwa kita dapat mengubah perilaku pembulatan dengan meneruskan metode pembulatan yang diinginkan sebagai parameter ketiga.

5. Pembulatan Ganda Dengan DoubleRounder

DoubleRounder adalah utilitas di pustaka decimal4j. Ini menyediakan metode cepat dan bebas sampah untuk pembulatan ganda dari 0 hingga 18 poin desimal.

Kita bisa mendapatkan pustaka (versi terbaru dapat ditemukan di sini) dengan menambahkan ketergantungan ke pom.xml :

 org.decimal4j decimal4j 1.0.3 

Sekarang, kita cukup menggunakan:

DoubleRounder.round(PI, 3);

Namun, DoubleRounder gagal dalam beberapa skenario, misalnya:

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Metode Math.round ()

Cara lain untuk membulatkan angka adalah dengan menggunakan Metode Math.Round ().

Dalam hal ini, kita dapat mengontrol n jumlah tempat desimal dengan mengalikan dan membaginya dengan 10 ^ n :

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

Metode ini tidak disarankan karena memotong nilainya . Dalam banyak kasus, nilai dibulatkan secara tidak benar:

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

Jadi, metode ini terdaftar di sini hanya untuk tujuan pembelajaran.

7. Kesimpulan

Dalam tutorial singkat ini, kami membahas teknik berbeda untuk membulatkan angka ke n tempat desimal.

Kita cukup memformat output tanpa mengubah nilainya, atau kita bisa membulatkan variabel dengan menggunakan metode helper. Kami juga telah membahas beberapa perpustakaan yang menangani masalah ini.

Kode yang digunakan selama diskusi dapat ditemukan di GitHub.