我想在Delphi中将此数字(12345678)舍入为(12345000)。我怎样才能做到这一点?我搜索了很多,但没有找到任何东西。 (SQL中类似的代码是Round(x,-3,1))。我也不知道该怎么用(GetRoundMode)。
谢谢 :)
最佳答案
您的函数可以这样实现:
function RoundDownToThousand(Value: Cardinal): Cardinal;
begin
Result := (Value div 1000)*1000;
end;
请注意,我使用了无符号类型,以避免必须预测负值的行为。如果确实要支持负值,请使用
Integer
,然后修改代码以提供所需的行为。为了对抗@HeartWare的断言,即他的代码更快,我提供以下程序:
{$APPTYPE CONSOLE}
uses
SysUtils, Diagnostics;
function RoundDownToThousandModSub(Value: Cardinal): Cardinal;
begin
Result := Value - Value mod 1000;
end;
function RoundDownToThousandDivMul(Value: Cardinal): Cardinal;
begin
Result := (Value div 1000)*1000;
end;
var
i: Cardinal;
Stopwatch: TStopwatch;
begin
Stopwatch := TStopwatch.StartNew;
for i := 0 to 1000000000 do
RoundDownToThousandModSub(i);
Writeln('RoundDownToThousandModSub: '+IntToStr(Stopwatch.ElapsedMilliseconds));
Stopwatch := TStopwatch.StartNew;
for i := 0 to 1000000000 do
RoundDownToThousandDivMul(i);
Writeln('RoundDownToThousandDivMul: '+IntToStr(Stopwatch.ElapsedMilliseconds));
Readln;
end.
我在E5530处理器上的Win7 x64上运行此程序,并使用带有RELEASE构建设置的默认控制台项目模板,使用XE3(32位和64位)编译。
32位结果
RoundDownToThousandModSub:5251
RoundDownToThousandDivMul:5214
64位结果
RoundDownToThousandModSub:5317
RoundDownToThousandDivMul:5297
因此,选择您认为读起来更好的版本。未经评估,决不能做出性能决定。您会经常发现您对性能的直觉是错误的。