四舍五入的货币

Jee*_*eva 1 delphi rounding truncation delphi-xe

我有以下代码来围绕货币

function MyRound(value :currency) : integer;

begin
  if value > 0 then
    result := Trunc(value + 0.5)
  else
    result := Trunc(value - 0.5);
end;
Run Code Online (Sandbox Code Playgroud)

到目前为止它运作良好,我现在的问题是,如果我想要像999999989000.4这样的货币,它给出负值,因为Truc接受int而MyRound也返回int.

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

Bog*_*cin 6

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

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

您不需要任何类型转换.有很多舍入功能可供您使用.只需围绕所需的数字.


Dav*_*nan 5

你把事情搞得太复杂了。您可以简单地使用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.
Run Code Online (Sandbox Code Playgroud)

哪个输出

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.
Run Code Online (Sandbox Code Playgroud)
999999989000
999999989001
999999989001
999999989001
999999989002
999999989002

  • 2.5 变为 2,3.5 变为 4,round 不会受到银行家四舍五入的影响吗?(或者反过来,永远记不住)。0.5 技巧是解决这个问题的最简单方法,而且不会弄乱 FPU 设置? (6认同)
  • 好吧,在标准 FPU 设置下,这就是 round 的工作原理。考虑到有基本的数学知识但没有财务背景,这并不是人们期望的工作方式。当我发现这件事时,我确实感到惊讶...... (6认同)
  • @MarjanVenema 嗯,这就是“Round”的工作原理。如果你想要不同的东西,那就使用不同的东西。 (2认同)