Skocz do zawartości

zmienna double - pytanie początkującego


adi

Recommended Posts

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 przez Bartosz Wójcik
Link do komentarza
Udostępnij na innych stronach

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.

  • Upvote 1
Link do komentarza
Udostępnij na innych stronach

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

 

Link do komentarza
Udostępnij na innych stronach

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));
    }
}

 

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...