为什么delphi的RoundTo方法表现不同?

时间:2014-08-27 05:36:30

标签: delphi rounding delphi-xe6

我注意到Delphi 7和XE6中的RoundTo()函数与某些数字的行为不同,并且它们都没有像文档中所说的那样依赖于银行家的方法。 我将以下数字序列传递给Delphi 7和XE6中的RoundTo(val,-4),它们返回一些数字的不同结果,你能解释一下原因吗?

Value       Dephi7      XE6
69.72505    69.7250     69.7250
69.72515    69.7251     69.7251
69.72525    69.7252     69.7253    <-- diff
69.72535    69.7254     69.7254
69.72545    69.7254     69.7254
69.72555    69.7255     69.7255
69.72565    69.7256     69.7257    <-- diff
69.72575    69.7258     69.7258
69.72585    69.7258     69.7258
69.72595    69.7259     69.7259

这是用于生成上述数字的delphi代码。我使用代码在Delphi 7和XE6中编译,得到了不同的结果。

procedure TForm1.Button1Click(Sender: TObject);
const
  valueList : Array[0..9] of double =
  ( 69.72505,
    69.72515,
    69.72525,
    69.72535,
    69.72545,
    69.72555,
    69.72565,
    69.72575,
    69.72585,
    69.72595
  );
var
  d : double;
  i : Integer;
begin
    Memo1.Clear;
    for i := Low(valueList) to High(valueList) do
      Memo1.Lines.Add(FloatToStr(valueList[i]) + ', ' + FloatToStr(RoundTo(valueList[i], -4)));

但是,如果我使用Round(val,4)在c#中这样做,这些就是我得到的,这与银行家的方法是一致的:

Value       Round
69.72505    69.7250
69.72515    69.7252
69.72525    69.7252
69.72535    69.7254
69.72545    69.7254
69.72555    69.7256
69.72565    69.7256
69.72575    69.7258
69.72585    69.7258
69.72595    69.7260

还有一件事,使用以下代码,这是delphi文档中的示例:

ShowMessage(FloatToStr(RoundTo(1.245, -2)));

Delphi 7给了我1.25,而XE6给了我1.24,这与他们的文件相矛盾。 (delphi 7 doco说1.24,但XE6 doco说1.25)。

你能解释一下原因吗?

0 个答案:

没有答案