konto usunięte

Temat: JAVA a odejmowanie Bug?

Witam,
Zadano mi pytanie dzisiaj:

Dlaczego :

double a=1.0;
double b=1.4;
double c= b - a;

System.out.println(c);

Daje wynik:
run:
0.3999999999999999

Dla b=1.3 wynik jest :
run:
0.30000000000000004

Dla b=1.1 wynik jest:
0.10000000000000009

Nie wiem o co chodzi, ale na 2 kompach tak samo to działa.

Ostatnio nie siedzę w Javie, więc od razu przekopiowałem pytanie na forum. Bo na szybkiego patrzyłem bo nie było warunków.

Proszę o info jak ktoś wie.

konto usunięte

konto usunięte

Temat: JAVA a odejmowanie Bug?

Jak na studenta politechniki pytanie jest wyjątkowo ... hm... boję się je nazwać.

Zgodnie ze standardem IEE 754 (bodajże) liczba zmiennoprzecinkowa double daje precyzję ok 15 cyfr po przecinku. I to się zgadza. Jeśli oczekujesz, że 1+1=2 używaj intów;)
Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: JAVA a odejmowanie Bug?

Dariusz Wawer:
Jak na studenta politechniki pytanie jest wyjątkowo ... hm... boję się je nazwać.

Zgodnie ze standardem IEE 754 (bodajże) liczba zmiennoprzecinkowa double daje precyzję ok 15 cyfr po przecinku. I to się zgadza. Jeśli oczekujesz, że 1+1=2 używaj intów;)

1.4 - 1.0 = 0.4

0.4 != 0.3999999999999999

chyba o to chodzi ;-)

a,b,c to double z tego co widzę, więc szczerze powiedziawszy, boje się że 'nie wiem jak to nazwać' ja też jestem...

http://ideone.com/jjR8dATrJerzy Mieczyński edytował(a) ten post dnia 20.01.10 o godzinie 22:10

konto usunięte

Temat: JAVA a odejmowanie Bug?

Sławomir Zych:
JAVA a odejmowanie Bug?
Nie pomnę już ilu studentów odkryło ten niesamowity "bug"...
Dariusz Wawer:
Jeśli oczekujesz, że 1+1=2 używaj intów;)
Ok, temat jest lekko absurdalny jak na to forum (podstawy teorii informatyki to chyba nie na goldenline?), ale skoro już mówimy oczywiste oczywistości to akurat potęgi 2 dodają się wyśmienicie, więc 1+1=2 ;)
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: JAVA a odejmowanie Bug?

http://support.microsoft.com/kb/78113

Każdy język programowania przechowuje w ten sposób liczby zmiennoprzecinkowe.
Jeśli chcesz otrzymywać ładne wyniki lub nie możesz sobie pozwolić na tę niedokładność możesz używać BigDecimal jeśli nie zależy Ci na szybkości lub skorzystać np. z DecimalFormat przy prezentacji wyników.

konto usunięte

Temat: JAVA a odejmowanie Bug?

Witam,

Dzięki za wypowiedzi w imieniu moim i osoby która mnie poprosiła o wrzucenie tego na forum.

Problemu nie badałem, szczegółowo osobiście gdyż nie miałem warunków.
Z grzeczności osoba która mnie poprosiła, twierdziła że siedziała przy tym długo , a ja nie miałem czasu to wrzuciłem to na forum.

I nie chodzi tutaj o liczbe 3000000004 a o 1.4-1.0 = 0,3999 itd.


Problem występuje w tym programie, właśnie dostałem kod.
Podajemy liczbę 1.4 i ma nam wydać z pieniędzy które mamy w tablicy M.

final int[] M = {500,200,100,50,20,10,5,2,1};
int zl, gr, r, i = 0;
System.out.println("Podaj reszte..");
System.out.print("w zlotych: ");
double odp=Input.readDouble();
zl=(int)odp;
gr=(int)((odp-zl)*100);

System.out.print("Reszta: ");
r = zl*100 + gr;
while (r > 0)
{
if (r >= M[i])
{
System.out.print(M[i]/100.0 + " ");
r = r - M[i];
}
else
i++;
}
System.out.println();
}

W powyższym programie mnożąc 0,3999 zł przez 100 i rzutując na int. Otrzymujemy nie 40 groszy a 39 groszy. Stąd ten problem został zauważony. Wydaje 1zł 39gr , zamiast 1zł 40gr.

Osoba która poprosiła mnie o wrzucenie na forum bardzo dziękuję.

konto usunięte

Temat: JAVA a odejmowanie Bug?

Sławomir Zych:

W powyższym programie mnożąc 0,3999 zł przez 100 i rzutując na int. Otrzymujemy nie 40 groszy a 39 groszy. Stąd ten problem został zauważony. Wydaje 1zł 39gr , zamiast 1zł 40gr.

Tutaj zerknij :

Representing money

konto usunięte

Temat: JAVA a odejmowanie Bug?

używaj intów:
zł = val/100
gr = val%100

a przy wczytywaniu dawaj
Integer.parseInteger(readString.replace("[\\.,]",""))

i tyle.

Albo w ogóle używaj wspomnianej BigDecimal

konto usunięte

Temat: JAVA a odejmowanie Bug?

Dariusz Wawer:
Jeśli oczekujesz, że 1+1=2 używaj intów;)
Ok, temat jest lekko absurdalny jak na to forum (podstawy teorii informatyki to chyba nie na goldenline?), ale skoro już mówimy oczywiste oczywistości to akurat potęgi 2 dodają się wyśmienicie, więc 1+1=2 ;)

to taka metafora była;)

//edit: dwa posty pod rząd, sorry, nie pomyślałem o edicieDariusz Wawer edytował(a) ten post dnia 21.01.10 o godzinie 10:33

Następna dyskusja:

Programista JAVA pilnie pos...




Wyślij zaproszenie do