Hallo zusammen,
ich verzweifle gerade an den Methoden System.Frac und System.Int und auch an Math.SimpleRoundTo
Die liefern bei mir für manche Zahlen in meinen Augen komplett irrsinnige Werte zurück.
Woran liegt das?
Code:
var
val : Extended;
frac : Extended;
frac2 : Extended;
Code:
val := 22.649;
val := val * 100; // 2264.9 drin
val := System.Int( val ); // 2264.0
frac := System.Frac( val ); // 0.9
frac2 := frac * 10.0; // 9.0
frac2 := System.Int( frac2 ); // Ergebnis ist 8.0 - wieso das?????
// auch komisch:
frac2 := frac * 10.0 // 9.0
frac2 := System.Frac( frac2 ); // Ergebnis ist 1.0 - wieso das?????
Ich kann mir diese Ergebnisse überhaupt nicht erklären; dass es mal durch Bit-Darstellung / Umwandlungen zu kleinen Abweichungen kommt, verstehe ich ja noch - aber so krass?
Achja, das ganze ist mit Delphi7 (ist ein Alt-Programm, muss ich leider immer noch verwenden), das dann unter Win10-x64 ausgeführt wird...
EDIT: noch ein Ergänzung: eigentlich brauche ich das ganze, um eine eigene Methode für das Runden von Nachkommastellen zu schreiben, weil die Bibliotheksfunktionen alle für mich nicht brauchbare Sachen (z.B. "Banker's rounding") machen:
Code:
val := 22.65;
val := Math.SimpleRoundTo( 22.65, -1 ); // erwartet hätte ich 22.7 als Ergebnis, ich bekomme aber 22.6 - warum???
Eigentlich ganz trivial: ich möchte beim runden auf eine bestimmte Nachkommastelle, dass wenn die nächste Stelle < 4 ist abrunden und wenn sie 5 oder größer ist, aufrunden.
Und zwar unabhängig davon ob die zu rundende Stelle eine gerade oder ungerade Zahl ist oder ob die gesamte Zahl positiv oder negativ ist oder ob heute schönes oder schlechtes Wetter ist...