Co jest powodem takiego wyniku?

0

Witam

Mam program który liczy wartośc ze wzoru.

    int k, t=1, LambdaMin, LambdaMax, KrokLambda;
    double wynik=0;


    silnia k1 = new silnia();
    
    for(int Lambda = 2; Lambda <= 2; Lambda++){
        
        for(k = 0; k <=10; k++){

            wynik = Math.pow((Lambda * t), k) / k1.silnia(k);

            System.out.println(wynik);

        }

w wyniku dostaje:
run:
1.0
2.0
2.0
1.3333333333333333
0.6666666666666666
0.26666666666666666
0.08888888888888889
0.025396825396825397
0.006349206349206349
0.0014109347442680777
2.821869488536155E-4
BUILD SUCCESSFUL (total time: 0 seconds)

Jak mogę sprecyzowac dokładność obliczeń np. do 6 miejsc po przecinku
i dlaczego ostatnia wartość jest wypisywana tak wypisywana: 2.821869488536155E-4

Pozdrawiam.

0

ostatnią liczbę możesz przyrównać do zera. E-4 oznacza że powinieneś przesunąć przecinek o 4 pozycję w lewo co da ci wynik zbliżony do zera.
To jest normalna liczba typu double tylko po prostu tak ci wypisało w output.

a tutaj:
zaokraglenie liczby float/double do n miejsc po przecinku

znajdziesz sposób na zaokrąglanie liczb :)

0

2.821869488536155E-4 to postać wykładnicza liczby, inaczej 2.821869488536155*10-4
Formatowane wypisywanie możesz uzyskać tak:

System.out.printf("%12.10f\n",liczba);

12 znaków, 10 po separatorze dziesiętnym, z przejściem do nowej linii.

0

Najlepszy spsob do takich dokladnych obliczen to uzycie BigDecimal. Wszystko inne (float, double) nie jest dokladne poniewaz liczb dziesietnych jakimi sie poslugujemyna codzien czesto nie da sie dokladnie przedstawic w systemie binarnym (takim jak dziala komp).

0
::. napisał(a)

Najlepszy spsob do takich dokladnych obliczen to uzycie BigDecimal. Wszystko inne (float, double) nie jest dokladne poniewaz liczb dziesietnych jakimi sie poslugujemyna codzien czesto nie da sie dokladnie przedstawic w systemie binarnym (takim jak dziala komp).

BigDecimal wcale nie jest taki wspaniały, np. taki kod: BigDecimal.ONE.divide(BigDecimal.valueOf(3L)); rzuca wyjątek "java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result." Jeżeli zastąpimy 3 przez 2, to wszystko jest ok.
BigDecimal tylko na liczbach wymiernych prowadzi dokładne działania.

Kod: BigDecimal.ONE.divide(BigDecimal.valueOf(3L), 10, RoundingMode.HALF_UP) da w wyniku BigDecimala równego dokładnie 0.3333333333
Za pomocą drugiego parametru można ustawić dokładność działania.

0

Prawde mowisz, ale i sam sobie odpowiedziales. Skoro wiesz ze chcesz tylko do 6 miejsc po przecinku to tak uzywasz tej klasy. Oczywiscie ze ona sama nie zgaduje Twoich mysli, ale uwazam ze lepiej taki wyjetek dostac jawnie niz jakies bledy w obliczeniach ktorych sie nie da znalezc.

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