Почему метод RoundTo в delphi ведет себя иначе?

Я заметил, что функция 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).

Не могли бы вы объяснить, почему?


person J Kok    schedule 27.08.2014    source источник
comment
Это аналогичный вопрос, и я считаю, что есть и ваш ответ: stackoverflow.com/questions/5191235/   -  person Harriv    schedule 27.08.2014
comment
Ни одно из этих чисел не может быть представлено в двоичном формате с плавающей запятой. Таким образом, округление банкиров никогда не применяется. Документация отстойная, потому что ни одно из значений не может быть представлено. Вы должны использовать десятичный тип данных, а не двоичный тип данных.   -  person David Heffernan    schedule 27.08.2014