Problem z kalkulatorem w javie

0

Witam, od niedawna uczę się programować i mam pewien problem. Chciałem zrobić swój kalkulator ale przy wykonywaniu działań na zmiennych typu double wychodzą mi dziwne wyniki.

public class Main {
    public static void main (String args[]){

        double liczba = 3;
        double liczba2 = 2.1;
        System.out.println(liczba*liczba2);
    }
}

Wynikiem tego działania jest liczba 6.300000000000001. Nie mam pojęcia skąd bierze się ta jedynka, jeśli ktoś wie prosiłbym o pomoc, z góry dziękuję.

2

Tak działa double. Użyj BigDecimal, jeśli potrzebujesz precyzji.
Tutaj wyjaśnienie: https://stackoverflow.com/questions/16707397/whats-wrong-with-this-simple-double-calculation/16708068#16708068

0

Nie mam pojęcia skąd bierze się ta jedynka

Bierze się stąd że liczby mają ograniczoną precyzje a możesz mieć nieskończone rozwinięcie dziesiętne. Jak zrobisz na kalkulatorze 2/3 to wyjdzie ci 0.6666666667 i ta 7 wynika właśnie z zaokrąglenia bo brakuje miejsca żeby pisać 6 w nieskończoność.

Pamiętaj tylko że komputer liczby przechowuje binarnie, więc np. liczba 1/10 jest ułamkiem z nieskończonym rozwinięciem okresowym.

0

Artykuł @Gynvael Coldwind na pewno trochę Ci rozjaśni

2

@krysnow32
Jeśli przez przypadek masz "Zrozumieć Programowanie", to jest to wytłumaczone na początku rozdziału 5 (jeśli nie masz, wyślij mi prywatną wiadomość, to Ci stosowny fragment wyślę).

Ogólnie rozbija się to o to, że dziesiętne 2.1 nie jest reprezentowalne w systemie binarnym, tj. wychodzi okres 10.(costam_w_okresie). Ponieważ nie da się tego dokładnie reprezentować, kompilator / CPU (w zależności co to wyliczy) staje przed pytaniem czy ma być "trochę mniej" czy "trochę więcej", i odpowiada na nie np. patrząc na ustawienia FPU (tam jest flaga, która mówi, jak to zaokrąglenie powinno wyglądać). W tym wypadku odpowiedź mogła być "trochę więcej", i to widać wyniku (jest trochę większy z uwagi na to zaokrąglenie, z uwagi na ten okres).

Ofc są liczby, które są dokładnie reprezentowane. Np. 2.25 * 3 da dokładny wynik (bo .25 to 0.01 binarnie, tj. 2**-2).

Jeśli potrzebujesz precyzyjnych decymalnych obliczeń, to @Inquis1t0r Ci podał rozwiązanie :)

0

Zawsze mozesz uzyc printf i zdecydowac ile chcesz wyprintowac miejsc po przecinku

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