Rechenfehler oder Denkfehler ? [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
sammler0002
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Mi, 23. Dez 2015 22:46
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Rechenfehler oder Denkfehler ? [Erledigt]

Beitrag von sammler0002 »

Moin,

unten stehender Code aus einem alten übernommenen Projekt gibt mir Rätsel auf ...

Die Zahlen kommen im richtigen Projekt aus Datenbankfeldern, damit man es nachvollziehen kann, habe ich sie hier mal direkt rein geschrieben.

Beim zweiten Vergleich wird nSaldo mit 397,46 verglichen, die beiden sollten (rein rechnerisch) ja gleich sein. Mir gibt das Programm aber aus, dass sie ungleich sind.

Kann mir hier jemand Erleuchtung schenken?

Code: Alles auswählen

local nSaldo   := 0

nSaldo += (257.04 - 0)

if nSaldo == 257.04  
    alert("Sehr gut!")   
endif


nSaldo += (140.42 - 0)

if nSaldo <> 397.46
     alert("What???")  
endif
Zuletzt geändert von sammler0002 am Di, 31. Mär 2020 10:34, insgesamt 1-mal geändert.
Grüße von Philipp
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Rechenfehler oder Denkfehler ?

Beitrag von Tom »

Du läufst in ein Problem mit der Fließkommaarithmetik, ohne es zu sehen. Ich würde vor die Vergleichsoperationen jeweils das hier setzen:

nSaldo := Round(nSaldo,2)
Herzlich,
Tom
sammler0002
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Mi, 23. Dez 2015 22:46
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Rechenfehler oder Denkfehler ?

Beitrag von sammler0002 »

Danke für die schnelle Antwort und entschuldige für die späte Rückmeldung :)

Mit round() läuft es richtig.

Aber man doof gefragt, ist das ein Bug oder "korrekt"? Ich meine das ist ja simples addieren, ist es korrekt, dass er dort in dieses Problem rein läuft?
Grüße von Philipp
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Rechenfehler oder Denkfehler ?

Beitrag von Tom »

Das Problem hat etwas damit zu tun, wie (nicht nur) Xbase++ Fließkommazahlen repräsentiert. Da kann es bei arithmetischen Operationen zuweilen zu Abweichungen im hinteren Nachkommabereich kommen - die dann eine Rolle spielen, wenn man solche Werte ihrerseits mit Fließkommazahlen vergleicht. Wenn man die Werte in Datenbankfeldern direkt vergleicht, hat man dieses Problem nicht, weil dort die Anzahl der Nachkommazahlen feststeht.
Herzlich,
Tom
sammler0002
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Mi, 23. Dez 2015 22:46
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Rechenfehler oder Denkfehler ?

Beitrag von sammler0002 »

Alles klar, danke für die Erläuterung !
Grüße von Philipp
Antworten