Как заставить тип валюты Delphi постоянно округляться, как в Excel?

Я пытаюсь настроить округление в 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;

Delphi Rounding

Я использую переменную валюты, для которой установлено значение 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 округляет его тип денег, как я описал.

  • SQL Money >= 0,005 = 0,01
  • Валюта Delphi >= 0,005 := 0,00

Правка №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;

9
задан Michael Riley - AKA Gunny 29 January 2013 в 23:56
поделиться