Skocz do zawartości

Recommended Posts

Napisano (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 przez Bartosz Wójcik
Napisano

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
Napisano

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

 

Napisano

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

 

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...