Цитата:
Весьма часто простые дроби вроде 0.1 или 0.7 не могут конвертироваться в их внутренние двоичные представления без потери точности. Это может привести к парадоксальным результатам: например, floor((0.1+0.7)*10) обычно возвращает 7 вместо ожидаемого 8 как результат внутреннего представления приблизительного числа 7.9999999999....
Причиной является то, что невозможно точно выразить некоторые дроби в десятичной нотации конечным количеством цифр. Например, 1/3 в десятичной форме имеет вид 0.3333333...
|
Кстати, если взять тип
Extended а не Double или Real, то точность сильно возрастает... вернее для данной задачи погрешности не наблюдается
Код:
var
i:integer;
x:Extended;
a:array of Extended;
begin
setlength(a, 10001);
x:=0;
for i:=0 to 10000 do
begin
a[i]:=x;
x:=x+0.01;
end;
end;
Для понимания вопроса стоит почитать о форме представления числа с плавающей точкой/запятой
.