axiomat napisał(a)
blad powstaje po dodaniu dwoch liczb, niech teraz bedzie sytuacja ze trzeba ten wynik prownac czy aby na pewno jest rowny jakiejs liczbie. Niech bedzie tak jak w przykladzie (5) + (-5.57) czy ten wynik jest rowny -0.57? Nie, wiec jakas czesc kodu po if sie nie wykona.
Liczby zmiennoprzecinkowe takie są! Nic z tym nie zrobisz! Porównywania dokonuje się w pewnej ustalonej granicy, np. delta=0.00001, porównanie: if( abs(a-b) < delta ) then Liczby są równe.
axiomat napisał(a)
Trzeba co s zrobic aby wynik byl dokladnie iles tam.
Ale tak się nie da dla każdej liczby przy kodowaniu binarnym. Da się np. dla 0,5; 0,25; itd. czy ich sumy; reszta to przybliżenia, dość dokładne nawet...
axiomat napisał(a)
jesli teraz bede sumowal jakies kwoty (np. rachunki ) i mam ich kilkanascie milionow to blad moze wejsc juz na znaczace pozycje :( a zaokraglanie po kazdym zsumowaniu powoduje spore opoznienie.
Właśnie po to są reprezentaje liczb specjalnie stworzone do tego celu, np. BCD, przechowywanie jako znaki, typy w stylu Monetary, itp. co JEST oczywiście wolniejsze...
axiomat napisał(a)
MarcinEc masz racje ze im wymagana wieksza dokladnosc tym niestety kod jest wolniejszy... ale czy naprawde nie ma czegos sensownego? Do jasnej cholery, niech mi ktos da namiary goscia (choc pewnie sie staral zeby to dobrze zrobic) ktory napisal metode do parsowania (Double.parseDouble(str1)) to go odwiedze ;P
Liczby typu double są tak przechowywane, muszą być zapisane na skończonej liczbie bitów. Inne rozwiązania już wspomniałem - oczywiście nie tak szybkie, tylko pytanie: czy naprawdę potrzebujesz szybkości, a nie jakości? Na jakiś kompromis ostatecznie możesz pójść, np. olać te błędy w reprezetacji double (oczywiście jeżeli możesz na to sobie pozolić... dla kwot pieniężnych NIE możesz).