1

我有以下代码来舍入货币

function MyRound(value :currency) : integer;

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

到目前为止它运行良好,我现在的问题是,如果我想对像999999989000.40这样的货币进行舍入,它会给出负值,因为 Truc 采用 int 并且 MyRound 也返回 int。

我可能的解决方案是将货币转换为字符串并在. 并将字符串转换回货币。这是一个正确的方法吗?我是delpi的新手,所以请帮帮我。

4

4 回答 4

6

从我的角度来看,你有两个选择:

  1. 正如大卫赫弗南指出的那样,您使用该Round功能;
  2. 您可以使用该SimpleRoundTo功能,如此所述。的优点SimpleRoundTo是它接收 , 和数据类型的参数SingleDouble并且Extended它们可以很好地转换这些数字。

您不需要任何类型转换。您已经可以使用许多舍入函数。只需四舍五入所需的数字。

于 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.}

我现在不能给你一个链接,但是谷歌:十进制舍入 John Herbster 我认为他最新的舍入例程在 DecimalRounding_JH1.pas 中。他对浮点舍入的讨论(Embarcadero 网站上的某个地方是“必读”。

于 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 回答