我注意到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)。
你能解释一下原因吗?