adi Napisano Wrzesień 22, 2016 Zgłoś Udostępnij Napisano Wrzesień 22, 2016 (edytowany) Cześć, jestem początkujący i nie wiem dlaczego kod: public class Stale{ public static void main(String[] args){ final double LICZBA_PI=3.14; final double STALA2=3.00; double wynik=LICZBA_PI+STALA2; System.out.println(wynik); } } daje wynik 6.140000000000001? Jeżeli zmienię wartość STALA2 na 3.01 to wynik jest poprawny. Edytowano Listopad 29, 2016 przez Bartosz Wójcik Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
andrus19 Napisano Wrzesień 24, 2016 Zgłoś Udostępnij Napisano Wrzesień 24, 2016 Jest to związane z wewnątrzą reprezentacją liczb zmienno-przecinkowych. Możesz sobie przeczytać tu https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems z czego wynika ten problem. Jeśli chcesz uzyskać precyzyjny wynik użyj klasy BigDecimal. Masz tu kawałek kodu, z którego szybko załapiesz o co chodzi: public static void main(String[] args) { final double stala = 3.00; final double stala1 = 3.14; System.out.println("double: " + stala); System.out.println("double1: " + stala1); System.out.println("double sum: " + (stala1 + stala)); BigDecimal bigDecimalPi = BigDecimal.valueOf(3.14); BigDecimal doublePi = new BigDecimal(3.14); System.out.println(bigDecimalPi.setScale(100)); System.out.println(doublePi.setScale(100)); System.out.println(bigDecimalPi.setScale(100)); System.out.println(BigDecimal.valueOf(stala).setScale(100)); System.out.println(bigDecimalPi.add(BigDecimal.valueOf(stala)).setScale(100)); } Zwróć uwagę na tworzenie bigDecimalPi oraz doublePi. 1 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
adi Napisano Wrzesień 26, 2016 Autor Zgłoś Udostępnij Napisano Wrzesień 26, 2016 coś mi nie poszło: Decimal.java:10: error: cannot find symbol BigDecimal bigDecimalPi = BigDecimal.valueOf(3.14); ^ symbol: class BigDecimal location: class Decimal Decimal.java:10: error: cannot find symbol BigDecimal bigDecimalPi = BigDecimal.valueOf(3.14); ^ symbol: variable BigDecimal location: class Decimal Decimal.java:11: error: cannot find symbol BigDecimal doublePi = new BigDecimal(3.14); ^ symbol: class BigDecimal location: class Decimal Decimal.java:11: error: cannot find symbol BigDecimal doublePi = new BigDecimal(3.14); ^ symbol: class BigDecimal location: class Decimal Decimal.java:15: error: cannot find symbol System.out.println(BigDecimal.valueOf(stala).setScale(100)); ^ symbol: variable BigDecimal location: class Decimal Decimal.java:16: error: cannot find symbol System.out.println(bigDecimalPi.add(BigDecimal.valueOf(stala)).setScale(100)); ^ symbol: variable BigDecimal location: class Decimal 6 errors Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
andrus19 Napisano Wrzesień 26, 2016 Zgłoś Udostępnij Napisano Wrzesień 26, 2016 musisz dodać import klasy na górze pliku import java.math.BigDecimal; 1 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
adi Napisano Wrzesień 26, 2016 Autor Zgłoś Udostępnij Napisano Wrzesień 26, 2016 Serdeczne dzięki Teraz wszystko ładnie działa import java.math.BigDecimal; public class Decimal{ public static void main(String[] args) { BigDecimal stala = BigDecimal.valueOf(3.00); BigDecimal stala1 = BigDecimal.valueOf(3.14); System.out.println(stala.setScale(100)); System.out.println(stala1.setScale(100)); BigDecimal wynik = stala.add(stala1); System.out.println(wynik.setScale(100)); } } Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.