舍入货币(rounding a currency)

2019-10-17 18:01发布

我有以下代码圆货币

function MyRound(value :currency) : integer;

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

它运作良好,到目前为止,我现在的问题是,如果我想圆一个货币一样999999989000.40它给负值,因为特吕克需要int和MyRound也返回int类型。

我可能的解决方案是将货币转换成字符串和之前得到的字符串 并串转换回货币。 这是一个正确的做法? 我是新来delpi所以请帮助我。

Answer 1:

你是过于复杂的问题。 你可以简单地使用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


Answer 2:

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

  1. 您可以使用Round的功能,如大卫·赫弗南指出;
  2. 您可以使用SimpleRoundTo功能,如所描述这里 。 的优点SimpleRoundTo是它接收的参数SingleDoubleExtended数据类型和它们转换一轮非常好喜欢那些说数字。

你不需要任何类型转换。 有大量的舍入的功能已经提供给您。 圆刚所需的号码。



Answer 3:

看看约翰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.}

我不能给你一个链接的权利,但谷歌:小数四舍五入约翰Herbster我觉得他最近的舍入例程在DecimalRounding_JH1.pas。 他的浮点舍入(Embarcadero公司的网站上某处的讨论是“必读”。



Answer 4:

这是我实际使用(很想听听是否有使用这种方法的任何问题!):

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


文章来源: rounding a currency