Jump to content
adi

zmienna double - pytanie początkującego

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.

Edited by Bartosz Wójcik

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.


×
×
  • Create New...