Eintragsdetails ansehen

IDProjektKategorieSichtbarkeitZuletzt aktualisiert
0000047Schwäbisch HallVerbesserungöffentlich2017-01-08 21:47
ReporterQuirin Bearbeitung durchfrank  
PrioritätnormalSchweregradFeature-WunschReproduzierbarN/A
Status geschlossenLösungerledigt 
RechnertypPCBetriebssystemWindowsBS-VersionJava 8
Produktversion2.1.3 
Zielversion2.1.4Behoben in Version2.1.4 
Zusammenfassung0000047: Fehler bei Salden durch unglücklichen Datentyp
BeschreibungFehlermeldung beim Log-Level-DEBUG:
"Das stimmt was mit den Salden nicht...!"

Der Datentyp für Geldbeträge ist unglücklich gewählt.
Verglichen wird z.B.
"6171.3499999999985 mit 6171.35"
Was fast gleich ist aber eben nicht gleich.
Runden ist keine Gute Idee.

In Java nimmt man für Geldbeträge als Datentyp Biginteger; steht in JS aber natürlich nicht zur Verfügung.

Eine geschicktere Möglichkeit ist es einen Prototype zu definieren:

//http://stackoverflow.com/questions/2876536/precise-financial-calculation-in-javascript-what-are-the-gotchas

var Money = function (amount) {
    this.amount = amount;
};

Money.prototype.valueOf = function () {
    return Math.round(this.amount * 100) / 100;
};

var m = new Money(50.42355446);
var n = new Money(30.342141);

Logger.info(m.amount + n.amount); //80.76569546
Logger.info(m + n); //80.76

Man müsste also alle "Amounts" etc durch Money ersetzen.




TagsKeine Tags zugeordnet.

Notizen / Dateien

frank

2017-01-08 20:55

Administrator   ~0000037

Hallo Qurin,
danke für den Hinweis. Prinzipiell macht die Routine ja auch nichts anderes. Sie rundet auf 2 Stellen, sowie das ValueOf des erweiterten Prototypen auch. Der Fehler im Skript liegt darin, das einmal, nämlich beim Testen gerundet wird, dass andere mal beim Erstellen der Buchungen aber nicht. Daher der Fehler. Die Überprüfungsroutine ist übrigens noch ein Code-Fragment aus einem älterem Skript und würde dort eigentlich gar nicht mehr benötigt.
Wie aber schon an anderer Stelle gesagt, bin ich dabei, alles auf ein Java-Backend umzustellen. Deshalb gibt es hier auch nur ein Bugfix. Das wird aber das Runden des Saldos beim Erstellen haben und sollte dann auch diese Unschönheit beseitigen.
Viele Grüße,
Frank

frank

2017-01-08 21:47

Administrator   ~0000040

Skript wird nicht mehr auf eine neuen Geldbetragtyp umgestellt. Fehler ist aber dadurch behoben, das beim Erstellen der Saldos auch gerundet wird.

Eintrags-Historie

Änderungsdatum Benutzername Feld Änderung
2017-01-08 20:19 Quirin Neuer Eintrag
2017-01-08 20:19 Quirin Status neu => zugewiesen
2017-01-08 20:19 Quirin Bearbeitung durch => frank
2017-01-08 20:48 guest Notiz hinzugefügt: 0000035
2017-01-08 20:49 frank Zielversion => 2.1.4
2017-01-08 20:55 frank Notiz hinzugefügt: 0000037
2017-01-08 21:47 frank Notiz hinzugefügt: 0000040
2017-01-08 21:47 frank Status zugewiesen => geschlossen
2017-01-08 21:47 frank Lösung offen => erledigt
2017-01-08 21:47 frank Behoben in Version => 2.1.4