Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

java - zaokrąglenie


Rekomendowane odpowiedzi

Opublikowano

Witam.

Mam takie pytanie:

Jak zrobić zaokrąglenie w javie do 8 miejsc po przecinku ???

Mam zadanie:

Napisz program zapisujący w pliku pierwiastki.txt wartości pierwiastków kwadratowych  i sześciennych dla liczb naturalnych od 2 do 15. Każdy wierz pliku powinien zawierać trzy liczby oddzielone znakami tabulatora – liczbę naturalną, pierwiastek kwadratowy z tej liczby i pierwiastek sześcienny. Pierwiastki podaj z precyzją do 8 miejsc po przecinku.

Rozwiązałem to tak:

 

package dafdh;


import java.io.FileWriter;
import java.io.IOException;


public class Dafdh {


    public static void main(String[] args) {


        try {
            try (FileWriter fout = new FileWriter("pierwiastki.txt")) {
                for (int i = 2; i <= 15; i++) {
                    fout.write(i + "\t");
                    fout.write(String.format(Math.sqrt(i) + "\t"));
                    fout.write(String.format(Math.cbrt(i) + "\t"));
                    fout.write("\r\n");
                }


            }


        } catch (IOException e) {
            System.out.println("Błąd ..." + e);
        }


    }


}
 

 

tylko nie wiem jak zrobić to zaokrąglenie ...

 

 

 

Opublikowano

Duzo lepiej jest uzyć tutaj klasy jak napisał kolega wyżej.

Jednak istnieje ciekawa sztuczka jak zaokraglic bez użycia żadnych zewnetrznych klas:

 

1. Mnożymy liczbe wejsciową przez 10n gdzie n jest precyzją jaką chcemy uzyskac

2. Zaokrąglamy dostępnymi metodami np. Math.round();

3. Dzielimy przez 10n

 

Przykład:

double n = 1.4444050433346d;
n *= 100000000;
n = (double) Math.round(n);
n /= 100000000;
Opublikowano

­

 

 

Duzo lepiej jest uzyć tutaj klasy jak napisał kolega wyżej.

Jednak istnieje ciekawa sztuczka jak zaokraglic bez użycia żadnych zewnetrznych klas:

 

1. Mnożymy liczbe wejsciową przez 10n gdzie n jest precyzją jaką chcemy uzyskac

2. Zaokrąglamy dostępnymi metodami np. Math.round();

3. Dzielimy przez 10n

 

Przykład:

double n = 1.4444050433346d;
n *= 100000000;
n = (double) Math.round(n);
n /= 100000000;

A pozniej nam przepelnia bufer.

String.format("%.8f", 4.123456789); 

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

 

­

 

A pozniej nam przepelnia bufer.

String.format("%.8f", 4.123456789); 

A teraz wytłumacz nam co to ten "bufer".

Opublikowano

A teraz wytłumacz nam co to ten "bufer".

Math.round przyjmuje double jako argument a zwraca long. long ma zakres +/- do 10^19. Czyli jeśli liczba, którą zaokrąglasz, po pomnożeniu razy 10^10 czy tam ile będziesz chciał tych miejsc po przecinku, będzie większa niż 10^19, to uzyskasz po prostu zły wynik. Jest to zły sposób. Co rozumiesz przez to, że nie używa (zewnętrznych?) klas? Przecież używasz Math.

708121422388637873334.png

Opublikowano

Math.round przyjmuje double jako argument a zwraca long. long ma zakres +/- do 10^19. Czyli jeśli liczba, którą zaokrąglasz, po pomnożeniu razy 10^10 czy tam ile będziesz chciał tych miejsc po przecinku, będzie większa niż 10^19, to uzyskasz po prostu zły wynik. Jest to zły sposób.

 

Faktycznie nie wpadłem.

 

 

Co rozumiesz przez to, że nie używa (zewnętrznych?) klas? Przecież używasz Math.

 

Chodziło mi o klasy które służyły by do zokrąglania liczb z precyzją.

Opublikowano

 

Duzo lepiej jest uzyć tutaj klasy jak napisał kolega wyżej.

Jednak istnieje ciekawa sztuczka jak zaokraglic bez użycia żadnych zewnetrznych klas:

 

1. Mnożymy liczbe wejsciową przez 10n gdzie n jest precyzją jaką chcemy uzyskac

2. Zaokrąglamy dostępnymi metodami np. Math.round();

3. Dzielimy przez 10n

 

Przykład:

double n = 1.4444050433346d;
n *= 100000000;
n = (double) Math.round(n);
n /= 100000000;

to że gramy w bezsensowne rozwiązania? xD

Nie gwarantuje że to działa dobrze, ale nawet zaokrągla!

Tak, wiem, wygląda pięknie, jak wyrzygany bigos po miesiącu.

Ale używa tylko java.lang :P a tak właściwe to tylko Double i String + prymitywy.

    public static String prec(final double d, int prec)
    {
        String s = Double.toString(d);
        final int dot = s.indexOf('.');
        int temp = (s.length() - dot - 1);
        prec = (prec > temp) ? temp : prec;
        if (prec <= 0)
        {
            return (dot == - 1) ? s : s.substring(0, dot);
        }
        if (dot != - 1)
        {
            temp = (dot + prec + 1);
            final char afterLast = (s.length() > temp) ? s.charAt(temp) : '0';
            temp = dot + prec;
            if (afterLast >= '5')
            {
                char last = s.charAt(temp);
                last++;
                s = s.substring(0, temp) + last;
            }
            else
            {
                s = s.substring(0, temp + 1);
            }
        }
        return s;
    }

A tutaj lnik z przykładem:

http://ideone.com/nrSzCo

 

 

Jeszcze jak jak ktoś się nudzi, może zmienić double w longa (Double.toLongBits czy jakos podobnie i sie bawić! :D)

1438614356923701010629.png

 

Opublikowano

to że gramy w bezsensowne rozwiązania? xD

Nie gwarantuje że to działa dobrze, ale nawet zaokrągla!

Tak, wiem, wygląda pięknie, jak wyrzygany bigos po miesiącu.

Ale używa tylko java.lang :P a tak właściwe to tylko Double i String + prymitywy.

    public static String prec(final double d, int prec)
    {
        String s = Double.toString(d);
        final int dot = s.indexOf('.');
        int temp = (s.length() - dot - 1);
        prec = (prec > temp) ? temp : prec;
        if (prec <= 0)
        {
            return (dot == - 1) ? s : s.substring(0, dot);
        }
        if (dot != - 1)
        {
            temp = (dot + prec + 1);
            final char afterLast = (s.length() > temp) ? s.charAt(temp) : '0';
            temp = dot + prec;
            if (afterLast >= '5')
            {
                char last = s.charAt(temp);
                last++;
                s = s.substring(0, temp) + last;
            }
            else
            {
                s = s.substring(0, temp + 1);
            }
        }
        return s;
    }

A tutaj lnik z przykładem:

http://ideone.com/nrSzCo

 

 

Jeszcze jak jak ktoś się nudzi, może zmienić double w longa (Double.toLongBits czy jakos podobnie i sie bawić! :D)

 

"Jeśli cos wygląda głupio ale działa, to wcale nie jest głupie".

Tym bradziej jeśli jest zamkniete w statycznej metodzie.

Opublikowano

 

"Jeśli cos wygląda głupio ale działa, to wcale nie jest głupie".

Może 30 lat temu. Jak coś dziś wygląda głupio ale (póki co) działa, to jest głupie. Tym bardziej jak jest zrobione tak w umyślnie bezsensowny sposób.

708121422388637873334.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...