Seite 1 von 1
Wie rechnet man mit Purebasic richtig?
Verfasst: 15.11.2010 20:39
von ath
Hi,
wie kann man mit Purebasic richtig rechnen? Folgender Code liefert bspw. das falsche Ergebnis:
Code: Alles auswählen
betrag.f = 163.49
If betrag - Int(betrag) < 0.49
Debug "< 50 Cent"
Debug betrag
Debug Int(betrag)
Debug betrag - Int(betrag)
Else
Debug "> 50 Cent"
Debug betrag
Debug Int(betrag)
Debug Int(betrag+1) - betrag
EndIf
In diesem Beispiel meint PB die Differenz sei größer 50 Center, was sie nicht ist, da Betrag mit 163.49000549316406 ausgewiesen wird. Bei der Gelegenheit direkt die nächste Frage: Wie rundet man in PB auf eine exakte Anzahl von Nachkommastellen? Up, Down und Nearest helfen da nicht weiter.
Danke und Gruß
Andreas
Re: Wie rechnet man mit Purebasic richtig?
Verfasst: 15.11.2010 20:46
von ts-soft
Die Suchfunktion sollte Deine Fragen beantworten, oder hier:
http://de.wikipedia.org/wiki/Gleitkommazahl
Re: Wie rechnet man mit Purebasic richtig?
Verfasst: 15.11.2010 20:49
von STARGÅTE
Wenns um Geld geht immer in Cents rechnen ! und nicht in Euros!
PB und alle andere Programmiersprachen rechnen mit Fließkommazahlen die immer eine ungenauigkeit haben (schon 1000 mal im Forum durchgekaut (keine Lust mit Links zu posten, sry)
Du kannst ja später immer noch die Cents wieder in Euros umrechnen, aber erst bei der Anzeige !
Code: Alles auswählen
betrag.q = 16349 ; Cent
If betrag%100 < 50
Debug "< 50 Cent"
Debug StrF(betrag/100.0,2)
Else
Debug "> 50 Cent"
Debug StrF(betrag/100.0,2)
EndIf
Außerdem ist ja deine Prüfung falsch:
Wieso < 0.49 ? also ist ja 0.49 falsch, also ist das ergebnis deines Codes eh richtig ..
wenn du schon im Debug schreibst < 50Cent
dann nutze auch <0.50 ..
aber wie gesagt, rechne mit Ganzen Zahlen und in Cents ...
Ausgabe dann über StrF(Betrag/100.0, 2) damit teilst du duch 100 und nimmst 2 nachkommastellen.
Edit:
(Beachte aber auch hier, das wieder rundungsfehler auftreten!) also besser noch ausgabe in Cents!
oder selbst das Komma setzen.
Re: Wie rechnet man mit Purebasic richtig?
Verfasst: 23.11.2010 22:14
von Riacon
ich bin jetzt vielleicht etwas spät, aber...
betrag.f = 163,49
Int(betrag)=-163,--
-------------------------
differenz 0,49
das ist offensichtlich NICHT größer als 0,49
also wird der else zweig der abfrage genommen. und da steht: Debug "> 50 Cent"
nicht weil pb so rechnet, sondern du
try this:
Re: Wie rechnet man mit Purebasic richtig?
Verfasst: 23.11.2010 23:58
von STARGÅTE
Er fragt oben ab ob
betrag.f = 163.49
If betrag - Int(betrag) < 0.49
ist,
Da steht eindeutig, ob es KLEINR ist als 0.49 !
Diese Aussage ergibt Falsch, denn betrag - Int(betrag) ist 0.49 !
Also geht es in den Else-Zweig, was er dann da schreibt, von wegen > 50 Cent, hat er geschrieben, nicht PB.
PB rechnet vollkommen richtig ...
Meine Frage an dich also: Worauf willst du hinaus ?
Im übrigen bekommst du bei JEDER Programmiersprache, die mit Floats rechnet (was du ja hier machst)
0.4900054931640625
Daran ist nicht falsch oder verbugt, das ist so!
(Links sind genügend vorhanden)
Edit: Sry meine Antwort ist irgendwie schräg ...
Re: Wie rechnet man mit Purebasic richtig?
Verfasst: 24.11.2010 00:11
von PureLust
Was Riacon vermutlich sagen will ist, dass das ursprüngliche Beispiel von ath einfach komplett falsch ist.
Wie Du ja selber oben bereits festgestellt hattest, fragte ath fälschlicherweise ab, ob 0.49 < 0.49 ist und geht dann in die ELSE-Anweisung in der dann behauptet wird 0.49(00054931640625) sei > 0.50.
Richtig wäre der code (und eben die Auswertung) so:
Code: Alles auswählen
betrag.f = 163.49
If betrag - Int(betrag) < 0.50
Debug "< 50 Cent"
Debug betrag
Debug Int(betrag)
Debug betrag - Int(betrag)
Else
Debug ">= 50 Cent"
Debug betrag
Debug Int(betrag)
Debug Int(betrag+1) - betrag
EndIf
Dann wäre (selbst bei Rundungsfehlern) die korrekte Ausgabe "< 50 Cent" heraus gekommen.
(Zumindest hab ich Riacons Post so verstanden.

)