[JAVA]beginnersvraag: vreemde afronding aftrekken doubles ?

Pagina: 1
Acties:

  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 07-03 23:42
Hoi ik merkte gisteren iets bijzonders, we moesten een klein programma maken als lesmateriaal. Niets bijzonders en dat testen.

Getallen betroffen allen double's.

Kwam op volgende neer, method pkate getal en telde die bij aanwezige saldo:

1.00 + 100.01 - 20.00 (dus in 2 stappen, 1.00 toekennen en dan 2 x optellen) gaf 81.01, is logisch

1.00 + 100.01 - 120.00 (dus in 2 stappen, 1.00 toekennen en dan 2 x optellen) gaf 18.989999999999995 en geen 18.99 (zoals ik verwachte).

Dat vond ik erg vreemd, maar niemand daar kon me uitleggen hoe dat nu kwam. Aangezien ik erg nieuwsgierig ben, iemand hier die dat misschien kan verklaren?

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • whoami
  • Registratie: December 2000
  • Laatst online: 10-04 23:02
Een double is gewoon niet zo precies. Dat komt door de interne representatie van floats.
Als je echt precisie wilt, moet je decimal gebruiken.

https://fgheysels.github.io/


Verwijderd

Ik verwacht bij die 2e eerlijk gezegd een negatief getal...
Maar het blijft wel raar :?
Whoami heeft weer de simpele oplossing :'(

[ Voor 21% gewijzigd door Verwijderd op 15-02-2006 15:11 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

Het is helemaal niet raar, als je gaat kijken hoe een double intern wordt opgeslagen (als bits).

linkje voor informatie: [uml=http://www.coolpython.nl/tutorials/tut/node15.html]Floating-point berekeningen: Problemen en beperkingen[/uml]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

offtopic:
Het meervoud is doubles, zonder apostrof ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 07-03 23:42
Verwijderd schreef op woensdag 15 februari 2006 @ 15:11:
Ik verwacht bij die 2e eerlijk gezegd een negatief getal...
Maar het blijft wel raar :?
Whoami heeft weer de simpele oplossing :'(
Ik zie nu pas wat je bedoelde die 18 is natuurlijk negatief, heb ik verkeerd gekopieerd.

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


Verwijderd

java.math.BigDecimal gebruiken

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nee, BigDecimal is geen oplossing voor niet weten wat je aan het doen bent.
Gelukkig is er een standaard verhaal: What Every Computer Scientist Should Know About Floating-Point Arithmetic.

De conclusie van whoami is overigens fout. Een double is wel zo precies, wel beter dan 10-4 Het resultaat is 18.99. Het enige probleem is dat de TS meer dan 16 cijfers probeert te printen. De precisie van een double is niet beter dan 10-16, maar dat heeft de TS helemaal niet nodig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1