Прежде всего, это не ошибка !!!
Вы используете тип числа double
- [Стандарт IEEE для арифметики с плавающей точкой (IEEE 754)] [1]. Это означает, что у вас нет точных чисел, но приблизительные числа близки к точному значению.
Например, если вы хотите добавить или вычесть наименьшее возможное значение к двойному значению мантиссы вокруг числа 33, тогда вы получите значения:
32.999999999999986
32.99999999999999
33.0
33.00000000000001
33.000000000000014
Это, по сути, самые близкие значения около 33, которые могут иметь двойные значения. Если вы не заметили разницу, то
32.99999999999999 // closest lower
32.999999999999999 // input value
33.0 // closest higher
Теперь 32.999999999999999
становится 33.0
, когда код интерпретируется или анализируется как число. Таким же образом, если вы напечатаете 32.9999999999999879
, вы получите 32.999999999999986
- double просто не имеет битов для сохранения этой дополнительной точности, и он будет заменен на ближайшее значение. Обратите внимание, что это не арифметически ближе всего, но, как это определено в стандарте.
Предлагаемое чтение: http://en.wikipedia.org/wiki/Machine_epsilon