zaokraglanie double - problemy

0

Chcę zaokrąlić liczbę typu double do powiedzmy dwóch miejsc po przecinku. Mam kod z dwiema funkcjami które mają zwracać zaokrągloną liczbę:

import java.text.DecimalFormat;
public class Main
{
    public static void main(String[] args)
    {
        double d1 = 1776.657;
        double d2 = rnd(d1);
        System.out.print(d2);
    }
    static double Round(double d)
    {
        java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
        nf.setMaximumFractionDigits(2);
        nf.setMinimumFractionDigits(2);
        try
        {
            return Double.parseDouble((nf.format(d)).replaceAll(",", ".").replaceAll(" ", ""));
        }
        catch (Exception e)
        {
            System.out.print("Nie mozna zaokraglic - ");
            return d;
        }
    }
    static double rnd(double d)
    {
        DecimalFormat df = new DecimalFormat();
        df.setMinimumFractionDigits(2);
        df.setMaximumFractionDigits(2);
        Double db = Double.parseDouble(df.format(d));
        return db;
    }

}

Problem w tym, że funkcje działają częściowo. Jeśli się poda liczbę trzycyfrową przed kropką (a dowolna ilość po niej) np. 354.2353253265, liczba się zaokrągla. Ale jeśli cyfra zaczyna się od czterech cyfr, to wyskakują wyjątki np. 4354.32424. Czemu? :|

0

OK, juz mam :d

przykład:

public static void main(String[] args)
{
		double rounded = 187.79999909;
 
		System.out.printf("%f%n", rounded);
		System.out.printf("%.8f%n", rounded);
		System.out.printf("%.2f%n",  rounded);
		
} 
//output
 
187.799999                 //Default is 6 decimal places
187.79999909
187.80 

teraz wszystko działa ;]

0

Kurcze, ale teraz mam kolejny problem.
Da sie to wyjscie jakos przekierowac na Stringa? Bo chcialbym to wyswietlic w textarea.

W tym czasie szukalem innych, podobnych po poprzednich sposobow na zaokraglenie. Tutaj jest kod z kilkoma takimi funkcjami: http://wklej.org/id/3932/ - problem w tym że dzialają tak jak poprzednie, tylko zamiast czterech cyfr przed kropką, to funkcje się wykrzaczają od ośmiu. O co chodzi, co z tym sie dzieje? Czemu nie mozna normalnie zaokraglic?

0

Byłem już na tej stronie i sprawdzałem te matody. To samo :-(

Mój problem jest taki:
gdy podam liczbę 7846587.456657865797 to ładnie zaokrągli do 7846587.46.
ale jak podam 78465871.456657865797 (jedna liczba przed kropką dodatkowo) to wynikiem już będzie 7.846587146E7.
Jakoś tak dziwnie to zaokrągla.

0

Nie mogę się domyślić co chcesz osiągnąć:

  • zaokrąglić liczbę 12345.5678912 => 12345.57,
  • utworzyć String z dwoma miejscami po separatorze
    12345.5678912 => "12345.57" lub 12345.5678912 => "12345.56".
    W temacie piszesz o zaokrągleniu, z treści wynika że raczej chodzi o utworzenie Stringu.
    Sprecyzuj pytanie.
    pozdrawiam
0

Jak chcesz, żeby się ładnie wyświetlało używaj BigDecimal zamiast double albo:

System.out.println ( NumberFormat.getInstance().format( round(78465871.456657865797, 2) ) );
0
bogdans napisał(a)

Sprecyzuj pytanie.
pozdrawiam

Chodzi mi o zaokrąglenie liczby, zapisanie wartości jako double i wczytanie liczby (np. w jtextarea). I jest problem z zaokragleniem

pustak napisał(a)

Jak chcesz, żeby się ładnie wyświetlało używaj BigDecimal zamiast double albo:

System.out.println ( NumberFormat.getInstance().format( round(78465871.456657865797, 2) ) );

no właśnie tylko tego wyjścia chyba nie mozna zapisać potem jako double?

No, ale skoro są takie problemy to chyba zrobię to operacjami na stringach - obcięcie, zaokrąglenie po swojemu i zapisanie jako double. :-/

1 użytkowników online, w tym zalogowanych: 0, gości: 1