Частично проблема заключается в том, что 0,33 не имеет точного представления в базовом формате, поскольку его нельзя выразить набором из 1 / 2n терминов. Таким образом, при умножении на 10 умножается число, немного отличающееся от 0,33.
Если на то пошло, 3.3 также не имеет точного представления.
Часть первая
Когда числа не имеют точного представления по основанию 10, будет остаток при преобразовании младшей значащей цифры, для которой была информация в мантиссе. Этот остаток будет распространяться вправо, возможно, навсегда, но в значительной степени это бессмысленно. Очевидная случайность этой ошибки связана с той же причиной, которая объясняет явно непоследовательное округление, которое заметили вы и Matchu. Это во второй части.
Часть вторая
И эта информация (самые правые биты) не выровнена четко с информацией, передаваемой одной десятичной цифрой, поэтому десятичная цифра обычно будет несколько меньше, чем ее значение было бы, если бы исходная точность была выше.
Вот почему преобразование может округляться до 1 при 15 цифрах и до 0.x при 16 цифрах: потому что более длинное преобразование не имеет значения для битов справа от конца мантиссы.
person
DigitalRoss
schedule
05.09.2011
==
плавающие числа, это ловушка. - person Reactormonk   schedule 09.05.2012