我有以下代码来整理货币
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的新手,所以请帮助我。
答案 0 :(得分:6)
从我的角度来看,你有两个选择:
Round
函数,正如David Heffernan指出的那样; SimpleRoundTo
功能,如here所述。 SimpleRoundTo
的优势在于它接收Single
,Double
和Extended
数据类型的参数,并且它们转换为非常好的数字,如上所述。您不需要任何类型转换。有很多舍入功能可供您使用。只是围绕所需的数字。
答案 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;