Ich versuche Delphi zu runden wie Excel, aber ich kann nicht. Hier ist der Code:Wie bekomme ich Delphi Currency Type, um die ganze Zeit wie Excel zu runden?
procedure TForm1.Button1Click(Sender: TObject);
var
s : string;
c : currency;
begin
c := 54321.245;
s := '';
s := s + Format('Variable: %m',[c]);
s := s + chr(13);
s := s + Format(' Literal: %m',[54321.245]);
ShowMessage(s);
end;
ich eine Währung Variable bin mit, die auf 54.321,245 gesetzt ist, und wenn ich formatiert diese Variable rundet mit Bankers Runden. Wenn ich jedoch den gleichen Wert wie ein Literal formatiere, rundet es den Excel-Runden-Modus ab.
Ich habe erwartet, dass dies auf $ 54,321.25 rundet, ob es sich um eine Währungsvariable oder einen Literalwert handelt. Wie kann ich sicherstellen, dass Delphi jedes Mal die gleiche Weise wie Excel ausführt?
bearbeiten
The rounding I expect to see is as follows:
54,321.245 = 54,321.25
54,321.2449 = 54,321.24
54,431.2499 = 54,421.25
ich nur Literale verwende die verschiedenen Möglichkeiten Delphi rundet zu zeigen. Ich erwarte, Variablen im eigentlichen Code zu verwenden.
Hinweis:
Wenn ich die Variable aus Währung zu es richtig verlängert ändern rundet
Edit # 2
Einige haben vorgeschlagen, dass ich nicht über eine Klares Verständnis meiner Anforderungen, das ist absolut nicht wahr. Ich habe ein klares Verständnis für meine Anforderungen, und ich bin offensichtlich nicht sehr gut darin, sie zu erklären. Die gewünschte Rundungsmethode ist zwei Dezimalstellen. Wenn der Dezimal-Teil einen Tausendstel-Wert> = 0,005 hat, möchte ich, dass er auf 0,01 gerundet wird. Der von Delphi angebotene Währungstyp tut das nicht. Ich habe dieses Beispiel auch mit Microsoft SQL mit einem Geld-Datentyp versucht (von dem ich annahm, dass es mit der Währung von Delphi identisch war) und SQL rundet seinen Geld-Typ so ab, wie ich es beschrieben habe.
- SQL Geld> = 0,005 = 0,01
- Delphi Währung> = 0,005: = 0,00
Edit # 3
Gut Artikel: http://rvelthuis.de/articles/articles-floats.html
Mögliche Lösung: http://rvelthuis.de/programs/decimals.html
Bearbeiten # 4
0 Hierist eine der Lösungen von Embarcadero Diskussion
function RoundCurrency(const Value: Currency): Currency;
var
V64: Int64 absolute Result;
Decimals: Integer;
begin
Result := Value;
Decimals := V64 mod 100;
Dec(V64, Decimals);
case Decimals of
-99 .. -50 : Dec(V64, 100);
50 .. 99 : Inc(V64, 100);
end;
end;
Sind Sie sicher, dass Excel 100% konsistent ist in allen seinen APIs und Funktionen in Runden? –
@Warren - Nein, ich bin mir nicht 100% sicher. Ich verkaufe Finanzanwendungen und muss sicherstellen, dass meine Zahlen mit denen von Excel übereinstimmen. –
Um diese Frage richtig zu beantworten, müssen Sie uns wirklich sagen, welche Art von Rundung Sie erwarten. –