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, BigDecimal
jeśli potrzebujesz dokładnej liczby.