Я пытаюсь настроить округление в Delphi, как в Excel, но не могу. Вот код:
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;
Я использую переменную валюты, для которой установлено значение 54321,245, и когда я форматирую эту переменную, она округляется с помощью Bankers Rounding. Однако, когда я форматирую одно и то же значение как литерал, оно округляется так, как округляет Excel.
Я ожидал, что это округлит до $54 321,25независимо от того, форматируется ли денежная переменная или буквальное значение.Как я могу убедиться, что Delphi каждый раз округляет так же, как Excel?
Редактировать
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
Я использую литералы только для того, чтобы показать различные способы округления в Delphi. Я ожидаю использовать переменные в реальном коде.
Примечание:
Если я изменю переменную с валютана расширенный, она округляется правильно
Редактировать #2
Некоторые предположили, что у меня нет четкое понимание моих требований, это абсолютно не так. Я очень четко понимаю свои требования, очевидно, я не очень хорошо их объясняю. Метод округления, который я хочу, - это два десятичных знака. Когда десятичная часть имеет тысячное значение >= 0,005, я хочу, чтобы оно было округлено до 0,01, тип валюты, предлагаемый Delphi, этого не делает. Я также попробовал этот пример, используя Microsoft SQL с типом данных money (который, как я предположил, был таким же, как валюта Delphi), и SQL округляет его тип денег, как я описал.
Правка №3
Хорошая статья: http://rvelthuis.de/articles/articles-floats. html
Возможное решение: http://rvelthuis.de/programs/decimals.html
Редактировать #4
Вот одно из решений из обсуждения Embarcadero
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;