Java - Pembulatan ke dua tempat desimal berdasarkan nilai desimal ketiga [duplikat]

Dec 16 2020

Saya telah duduk di atasnya selama sehari sekarang berpikir seperti siswa sekolah dasar 5.

public class Tester 
{                                                          
    static String actualValue = "";
    private static DecimalFormat df2 = new DecimalFormat("#.##");  //To round off to two decimal places.
    static double regPrice = 0.0;
    static double regPrice2 = 0.0;
    
     public static void main(String[] args) 
     {
          regPrice2 = 1506.365;
          
          System.out.println("reg price 1 is: "+regPrice2);
          System.out.println("reg price 1 after rounding is is: "+round(regPrice2));
          
          regPrice = 8535.765;
          
          System.out.println("reg price  is: "+regPrice);
          System.out.println("reg price  after rounding is: "+round(regPrice));
      }
     
     public static double round(double value) 
        {         
            df2.setRoundingMode(RoundingMode.HALF_UP);
            String returnValue = df2.format(value);
            double actualValue = Double.parseDouble(returnValue);
            return actualValue;   
        }
    
}    
Keluaran Nilai 1 Nilai 2
Sebenarnya 1506,37 8535. 76
Diharapkan 1506,37 8535. 77

Mengapa pembulatan berhasil untuk angka pertama tetapi tidak untuk angka kedua? Bagaimana saya bisa membuat ini bekerja?

Jawaban

1 TomášZáluský Dec 16 2020 at 07:51

Berkat representasi floating-point, apa yang menurut Anda 1506.365 atau 8535.765 sebenarnya adalah angka yang sedikit lebih besar atau lebih kecil dari yang Anda harapkan. Angka floating-point direpresentasikan sebagai mantissa dan eksponen. Karenanya misalnya untuk 0,365 dan 0,765 pembulatan dilakukan secara berbeda. Pembulatan di dekat bagian kemudian muncul dalam arah acak. Gunakan BigDecimaljika Anda membutuhkan nomor yang tepat.