Я заметил, что функция RoundTo() в Delphi 7 и XE6 ведет себя по-разному с некоторыми числами, и ни одна из них не использует метод банкира, как указано в документации. Я передаю следующую серию чисел в RoundTo(val, -4) в Delphi 7 и XE6, и они возвращают разные результаты для некоторых чисел, не могли бы вы объяснить, почему?
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), я получу вот что, что соответствует методу банкира:
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 указано 1.24, но в документации XE6 указано 1.25).
Не могли бы вы объяснить, почему?