我有以下代码圆货币
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所以请帮助我。
你是过于复杂的问题。 你可以简单地使用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
从我的角度来看,你有两个选择:
- 您可以使用
Round
的功能,如大卫·赫弗南指出; - 您可以使用
SimpleRoundTo
功能,如所描述这里 。 的优点SimpleRoundTo
是它接收的参数Single
, Double
和Extended
数据类型和它们转换一轮非常好喜欢那些说数字。
你不需要任何类型转换。 有大量的舍入的功能已经提供给您。 圆刚所需的号码。
看看约翰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公司的网站上某处的讨论是“必读”。
这是我实际使用(很想听听是否有使用这种方法的任何问题!):
function RoundingFunction(X: Real): Int64;
begin
Result := Trunc(SimpleRoundTo(X, 0));
end;