Распространенное заблуждение. Храним в decimal, а считаем на FPU? Все, что нужно знать — точность при рендере double в строку, чтобы получить 0.3, а не 0.299999999. Вычисления точно также делаются, с округлениями после.
Сравнение double — странно, что кто-то еще не знает: abs((0.1 + 0.2) - 0.3) < epsylon