四舍五入的货币

时间:2013-02-22 12:11:41

标签: delphi delphi-xe rounding truncation

我有以下代码来整理货币

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 个答案:

答案 0 :(得分:6)

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

  1. 您使用Round函数,正如David Heffernan指出的那样;
  2. 您可以使用SimpleRoundTo功能,如here所述。 SimpleRoundTo的优势在于它接收SingleDoubleExtended数据类型的参数,并且它们转换为非常好的数字,如上所述。
  3. 您不需要任何类型转换。有很多舍入功能可供您使用。只是围绕所需的数字。

答案 1 :(得分: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

答案 2 :(得分:1)

看看John Herbster的舍入程序。它们提供了您可能想要的几乎任何类型的舍入,例如:

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网站的某个地方是“必读”。

答案 3 :(得分:0)

这是我实际使用的(如果这种方法有任何问题,我很乐意听到!):

function RoundingFunction(X: Real): Int64;
begin
  Result := Trunc(SimpleRoundTo(X, 0));
end;