Warum ist das Ergebnis RoundTo(87.285, -2) => 87.28
Ich erwartet, dass das Ergebnis wäre 87.29. Ich habe auch versucht SimpleRoundTo, aber führt zum selben Ergebnis.
In der Hilfe gibt es auch ein "seltsames" Beispiel:
ms-help://embarcadero.rs2010/vcl/Math.RoundTo.html
RoundTo(1.235, -2) => 1.24
RoundTo(1.245, -2) => 1.24 //???
Weiß jemand, welche Funktion die ich brauche, um das Ergebnis 87.29? Ich meine: Wenn die Letzte Ziffer >= 5 aufrunden, wenn < 5 Runden nach unten ab. Wie in der Schule gelehrt 🙂
Benutze ich Delphi2010, und SetRoundMode(rmNearest)
. Ich habe auch versucht mit rmTruncate
.
Der Wert 87.285 gespeichert ist, in eine double
variable.
Auch seltsam:
SimpleRoundTo(87.285, -2) => 87.29
aber
x := 87.285; //double
SimpleRoundTo(x, -2) => 87.28
Google "Bankers rounding"
Wie bereits von David und Rob unten, dem obigen Kommentar ist nicht so groß, wie es vielleicht zunächst erscheinen.
Wie bereits von David und Rob unten, dem obigen Kommentar ist nicht so groß, wie es vielleicht zunächst erscheinen.
InformationsquelleAutor markus_ja | 2011-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
87.285, ist nicht exakt darstellbar ist und der nächste Doppel ist etwas kleiner.
Die klassische Referenz auf Gleitkomma Was Jeder Computer Scientist Should Know About Floating-
Point Arithmetik.
Für die Währung basierte Berechnungen, wenn in der Tat dies ist, sollten Sie verwenden eine base-10-Zahl-Typ statt der Basis 2 floating point. In Delphi das bedeutet, dass
Currency
.Currency
. Währung darstellen kann, die Zahl und Rundung richtig rund.Ich scheinen, um die Menschen darauf hinweisen, dass der Artikel die ganze Zeit. Die Leute scheinen zu denken, dass floating-point-zahlen haben Fähigkeiten, die über Ihre tatsächlichen Fähigkeiten. Wie die Fähigkeit zur Darstellung eines Dritten. Und Banker Rundung überraschungen, viele Menschen zu.
Währung ist immer ein base-2-Wert, sondern einen integer-Wert (obwohl es geschafft durch die FPU, wenn ich mich Recht erinnere) automatisch skaliert auf vier Nachkommastellen (Fix). Binär-codierte Dezimalzahlen umgesetzt mit TBCD. Es kann leicht manipuliert mit Varianten (siehe VarFMTBCDCreate).
Ich denke, Währung ist effektiv eine base-10 fixed-point-Wert, umgesetzt mit Ganzzahlen.
Währung hat eine 2^63-Bereich (vor der Skalierung, Skalierung genau festlegen, wo der Dezimalpunkt in der Zahl) , dadurch sieht es IMHO eine Basis 2 Typ 🙂 TBCD eine Zahl von 0 bis 9 pro nibble in seiner Fraktion Bereich, und sieht eine Basis-10-Typ.
InformationsquelleAutor David Heffernan
Den genauen Wert 87.285 ist nicht darstellbar, da ein floating-point-Wert in Delphi. Eine Seite auf meiner Web-site zeigt, was dieser Wert wirklich ist, als Extended, Double und Single:
Standardmäßig, floating-point-Literale in Delphi Art Erweitert, und wie Sie sehen können, die Erweiterte version Ihrer Anzahl ist etwas höher als 87.285, so ist es richtig, dass die Rundung auf die nächste Runde würde. Aber als ein Double, das die tatsächliche Zahl ist etwas niedriger. Das ist, warum Sie bekommen die Nummer, die Sie erwartet, wenn Sie explizit speichern die Zahl in eine Double-variable vor dem Aufruf
RoundTo
. Es gibt überladungen der Funktion für jede Delphi-floating-point-Typen.+1, die große Seite war der wichtigste resaon, warum ich habe Interesse an Gute Delphi-Blogs!
InformationsquelleAutor Rob Kennedy