Java - zaokrąglij do dwóch miejsc po przecinku na podstawie trzeciej wartości dziesiętnej [duplikat]

Dec 16 2020

Siedzę nad tym od dnia, myśląc jak uczeń piątej klasy.

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;   
        }
    
}    
Wynik Wartość 1 Wartość 2
Rzeczywisty 1506,37 8535. 76
Spodziewany 1506,37 8535. 77

Dlaczego zaokrąglanie działa dla pierwszej liczby, ale nie dla drugiej? Jak mogę to zrobić?

Odpowiedzi

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

Dzięki reprezentacji zmiennoprzecinkowej to, co myślisz, 1506.365 lub 8535.765 jest w rzeczywistości liczbą nieco większą lub mniejszą niż się spodziewasz. Liczby zmiennoprzecinkowe są reprezentowane jako mantysa i wykładnik. Stąd na przykład dla 0,365 i 0,765 zaokrąglanie jest wykonywane inaczej. Zaokrąglanie blisko połówek pojawia się wtedy w przypadkowym kierunku. Użyj, BigDecimaljeśli potrzebujesz dokładnej liczby.