我想在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


因此,选择您认为读起来更好的版本。未经评估,决不能做出性能决定。您会经常发现您对性能的直觉是错误的。

09-11 17:21