Single
(или float
) имеет только семь значащих цифр, так что все, что может быть напечатано за их пределами, в любом случае является довольно поддельным. Это нормальный артефакт арифметики с плавающей точкой. Вы можете полагаться только на 4 цифры после десятичной точки с вашим номером (так как три значащие цифры уже перед десятичной точкой).
Более подробно, числа 8.01 и 8.02 не могут быть точно представлены с использованием двоичного хранилища (поскольку ни 0,01, ни 0,02 не могут быть представлены точно с суммами долей вида 1/2 n ). Детали могут варьироваться от номера к номеру, но при использовании таких чисел вы можете видеть посторонние цифры вне нормального диапазона точности.
Это не влияет на тот факт, что 801 и 802 могут быть точно представлены , но у вас нет точного номера для начала в этом случае.
ETA: Фактически, то, что вы видите, когда вы включаете вычисление напрямую, заключается в следующем: компилятор оценит вычисление для вас и просто напишет 802
в программу. Вы можете использовать Reflector, чтобы проверить это. Также литералы с плавающей запятой в исходном коде, вероятно, по умолчанию Double
, поэтому у вас гораздо большая точность для начала. Если result
равно Single
, то оно будет понижено до Single
, а ошибка в 16-й цифре после десятичной точки просто отбрасывается, поскольку она все равно не может вписаться в Single
.