Верите ли вы в это или нет, это намеченное поведение и соответствует некоторому стандарту IEEE.
Невозможно представить аналоговое ежедневное значение, такое как массовое число или небольшая дробь с полнымверность в одном двоичном представлении.Числа с плавающей точкой в .NET, такие как float или double, делают все возможное, чтобы минимизировать ошибку при назначении им чисел, поэтому, когда вы присваиваете 0,2 переменной, язык делал все возможное, чтобы выбрать представление с наименьшей ошибкой.
Дело не в том, что число каким-то образом ухудшается в памяти - это осознанный шаг.Если вы сравниваете числа с плавающей запятой, вы всегда должны разрешать регион с любой стороны вашего сравнения, который является приемлемым.Ваше представление 0.2 близко к очень большому количеству десятичных знаков.Это достаточно хорошо для вашего приложения?Это выглядит ярко на ваших глазах, но на самом деле это очень маленькая ошибка.При сравнении значений типа double и float (с целыми числами или друг с другом) вы всегда должны учитывать допустимую точность и принимать диапазон по обе стороны от ожидаемого результата.
Вы также можете выбрать использование других типовкак десятичное , которое имеет очень хорошую точность в десятичных разрядах - но также очень велико по сравнению с числами с плавающей запятой и удваивается.