На первый взгляд, проблема в представлении десятичных чисел в двоичном формате.
Надо смотреть исходный текст
round, но близкое поведение имеются и в других пакетах, оперирующих с числами с плавающей точкой.
В системах компьютерной алгебры такой проблемы вроде бы нет.
В указанном выше
Dmitriy40 Pyton недоступен SymPy.
Maple 7
Код:
> seq(evalf[1](0.05+i/10), i=1..9);
.2, .2, .4, .4, .6, .6, .8, .8, 1.
В более сложных случаях нужно ручками что-то сделать, но вроде преодолимо.
Немного криво с ходу набрал в Matlab 2013
Код:
i = 0:9;
x = sym(0.05 + i/10);
vpa(round(vpa(10*x))/10)
ans = [ 0, 0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8, 1.0]
Т.е., на первый взгляд, если нужно точное представление десятичных чисел, то, увы, символьные вычисления. А
round с плавающей точкой — это для численных расчётов.
но вот про single и double это не так
Вроде
photon привел правильное значение.
Если используется одинарная точность IEEE 754 (или более поздний преемственный стандарт), то число 2.675 будет иметь двоичное представление 10.1010110011001100110011. Мантисса числа (IEEE 754) будет содержать 01010110011001100110011 (23 бита). Обратное преобразование в десятичное даёт 2.6749999523162841796875.
Правые три нуля очевидно некорректны, а цифры начиная с 5 в первой строке недостоверны, просто шум (не случайный, а из-за формата хранения).
Просто округление и добавлены нули для получения строки с заданным числом символов.
Если используется двойная точность, то число 2.675 будет иметь двоичное представление
10.101011001100110011001100110011001100110011001100110.
Мантисса числа (IEEE 754) будет содержать 0101011001100110011001100110011001100110011001100110 (52 бита).
Обратное преобразование в десятичное даёт 2.67499999999999982236431605997495353221893310546875.
Это совпадает с числом, приведенным
photon.
Ожидается, конечно, что без указания типа Pyton будет работать с double.
double значение равно 0x4005666666666666. Кто хочет воспользуйтесь любыми калькуляторами
Воспользовался встроенным калькулятором Windows для преобразования 0x4005666666666666 в двоичное представление и получил
100000000000101011001100110011001100110011001100110011001100110.
Первые 52 бита этого числа (52 бита мантиссы, биты считаются справа: нулевой бит самый правый)
0101011001100110011001100110011001100110011001100110.
Это совпадает с приведенным выше значением мантиссы.
Функция
Writeln Delphy просто не выдаёт все знаки (просто округление и добавление нулей для получения строки с заданным числом символов).