Существенная проблема, с которой вы столкнулись, состоит в том, что числа с плавающей запятой не могут представлять ваши примерные числа, поэтому ваш ввод всегда будет немного отличаться. Поэтому, если вы точно произведете вывод, он будет отличаться от того, что вы ожидаете, так как числа ввода отличаются от того, что вы думаете.
Если вам не нужно беспокоиться о большие числа, вы можете сделать это проще всего, преобразовав в long:
v = v - (long)v; // remove the integer part
int frac = (int)(v * 100000);
даст вам 5 цифр после десятичной точки. Проблема в том, что он дает неопределенное поведение, если начальное значение слишком велико для преобразования в long. Возможно, вы также захотите округлить по-другому (преобразовать в усечения int до нуля) - если вам нужно ближайшее значение, а не первые 5 цифр дроби, вы можете использовать (int)(v * 100000 + (v > 0 ? 0.5 : -0.5))