Просто чтобы объяснить причину того, что говорят все остальные.
Бинарное представление с плавающей точкой раздражает.
В двоичном коде большинство программистов знают соотношение между 1b = 1d, 10b = 2d, 100b = 4d, 1000b = 8d
Ну, это работает и по-другому.
.1b = .5d, .01b = .25d, .001b = .125, ...
Проблема заключается в том, что нет точного способа представления большинства десятичных чисел, таких как .1, .2, .3 и т. Д. Все, что вы можете сделать, это приблизительные в двоичном формате. Система делает небольшое округление, когда числа печатаются так, что она отображает .1 вместо .10000000000001 или .999999999999 (которые, вероятно, так же близки к сохраненному представлению, как и .1)
Редактировать из комментария: причина этого является нашими ожиданиями. Мы полностью ожидаем, что 2/3 будет помечено в какой-то момент, когда мы преобразуем его в десятичное число, или .7 или .67 или .666667 .. Но мы не ожидаем, что .1 будет округлено так же, как 2/3 - и это именно то, что происходит.
Кстати, если вам интересно, число, которое оно хранит внутри, является чисто двоичным представлением, использующим двоичную «научную нотацию». Таким образом, если вы скажете ему, чтобы хранить десятичное число 10,75d, он будет хранить 1010b для 10 и .11b для десятичного. Таким образом, он будет хранить .101011, а затем в конце сохранит несколько битов, чтобы сказать: переместите десятичную точку на четыре позиции вправо.
(Хотя технически это уже не десятичная точка, теперь это двоичная точка, но эта терминология не сделала бы вещи более понятными для большинства людей, которые нашли бы этот ответ для любого использования.)