1. Дробную часть можно получить и проще:
      double d = 5.7;
      int i = (int)d;
      double fract = d - i;
(Конечно же, лучше оформить функцией).
2. Данные в компьютере представляются в виде двоичных, а не десятичных дробей. Поэтому зачастую дробь, выглядящая гладко в десятичном представлении, в двоичном представляет собой бесконечную цепочку (например, 1.9999999.... вместо 2.0).
Все числа в формате плавающей точки представляют собой значения, округленные с некоторой точностью (в случае 
double - примерно 15 знаков). При выполнении арифметических операций ошибка округления накапливается. Поэтому не стоит паниковать, если результат отличается от ожидаемого в 14-15 знаке, это вполне обычное явление. Точные вычисления возможны лишь для интегральных типов данных.