1

私は通貨を丸めるために次のコードを持っています

function MyRound(value :currency) : integer;

begin
  if value > 0 then
    result := Trunc(value + 0.5)
  else
    result := Trunc(value - 0.5);
end;

Trucはintを取り、MyRoundもintを返すため、999999989000.40のような通貨を丸めたい場合、負の値が返されます。

私の考えられる解決策は、通貨を文字列に変換し、前に文字列を取得することです。文字列を通貨に変換します。これは正しいアプローチですか?私はデルピが初めてなので、助けてください。

4

4 に答える 4

6

私の観点からは、次の 2 つのオプションがあります。

  1. RoundDavid Heffernanが指摘したように、関数を使用します。
  2. ここでSimpleRoundTo説明されているように、関数を使用できます。の利点は、 、およびデータ型のパラメーターを受け取り、それらが記載されているような数値を非常にうまく変換することです。SimpleRoundToSingleDoubleExtended

型変換は必要ありません。すでに利用可能な丸め関数がたくさんあります。必要な数を四捨五入するだけです。

于 2013-02-22T12:48:12.113 に答える
4

あなたは問題を複雑にしすぎています。あなたは単に使用することができますRound

program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  C: Currency;

begin
  C := 999999989000.4;
  Writeln(Round(C));
  C := 999999989000.5;
  Writeln(Round(C));
  C := 999999989000.6;
  Writeln(Round(C));
  C := 999999989001.4;
  Writeln(Round(C));
  C := 999999989001.5;
  Writeln(Round(C));
  C := 999999989001.6;
  Writeln(Round(C));
  Readln;
end.

どの出力

999999989000
999999989000
999999989001
999999989001
999999989002
999999989002

バンカーの丸めが不要で、本当にTruncロジックが必要な場合は、独自の関数を作成する必要があります。ただし、関数の問題は、32ビット整数に切り捨てられていたことです。関数が64ビット整数を返すようにします。

program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

var
  C: Currency;

function MyRound(const Value: Currency): Int64;
begin
  if Value > 0 then
    result := Trunc(Value + 0.5)
  else
    result := Trunc(Value - 0.5);
end;

begin
  C := 999999989000.4;
  Writeln(MyRound(C));
  C := 999999989000.5;
  Writeln(MyRound(C));
  C := 999999989000.6;
  Writeln(MyRound(C));
  C := 999999989001.4;
  Writeln(MyRound(C));
  C := 999999989001.5;
  Writeln(MyRound(C));
  C := 999999989001.6;
  Writeln(MyRound(C));
  Readln;
end.
999999989000
999999989001
999999989001
999999989001
999999989002
999999989002
于 2013-02-22T12:25:34.777 に答える
1

ジョン・ハーブスターの丸めルーチンを見てください。それらはあなたが望むかもしれないほとんどすべてのタイプの丸めを提供します、例えば:

drNone,    {No rounding.}
drHalfEven,{Round to nearest or to even whole number. (a.k.a Bankers) }
drHalfPos, {Round to nearest or toward positive.}
drHalfNeg, {Round to nearest or toward negative.}
drHalfDown,{Round to nearest or toward zero.}
drHalfUp,  {Round to nearest or away from zero.}
drRndNeg,  {Round toward negative.                    (a.k.a. Floor) }
drRndPos,  {Round toward positive.                    (a.k.a. Ceil ) }
drRndDown, {Round toward zero.                        (a.k.a. Trunc) }
drRndUp);  {Round away from zero.}

現在、リンクを提供することはできませんが、Google:10進数の丸めJohnHerbster彼の最新の丸めルーチンはDecimalRounding_JH1.pasにあると思います。浮動小数点の丸めに関する彼の議論(EmbarcaderoのWebサイトのどこかで「必読」です。

于 2013-02-23T08:28:39.117 に答える
0

これは私が実際に使用しているものです (このアプローチに問題があるかどうかを知りたいです!):

function RoundingFunction(X: Real): Int64;
begin
  Result := Trunc(SimpleRoundTo(X, 0));
end;
于 2013-02-22T15:12:22.453 に答える