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