Почему 0.2f + 0.3f == 0.5f?
0.2 = 1.100110011001100110011012 * 2-3
0.3 = 1.001100110011001100110102 * 2-2
Приводим к старшей степени, сохраняя количество двоичных разрядов.
0.2 = 0.110011001100110011001102 * 2-2
Складываем, получаем
0.110011001100110011001102 * 2-2
+
1.001100110011001100110102 * 2-2
= 
10.00000000000000000000002 * 2-2
 = 1.0000000000000000000002 * 2-1 = 0.5
Здесь уместно вспомнить, что стопроцентно целых чисел не бывает в природе - это всегда округление с некоторой требуемой точностью. Но компьютер построен на бинарной логике, и поэтому лучше всего оперирует именно с целыми числами.
Поэтому, когда вы предлагаете пользователю оперировать числами с плавающей точкой, всегда требуется предоставить ему возможность задавать параметр требуемой точности вычислений. И уже дальше оперировать этими числами, исходя из этих требований.
Потому что если для вас, как программиста, нет никакой разницы между 0.1f и 0.9999999999999f, то для любого пользователя эта разница вполне очевидна.