Чтобы было понимание, почему так происходит, дополню:
При попытке чтения 0.1 читается только 0, так как требуется целое число, а ".1" так и остаётся в потоке. Соответственно второй раз идёт попытка прочесть целое из ".1", что приводит к ошибке, а std::cin приходит в ошибочное состояние (std::ios::failbit), n остаётся неизменным, и всё начинает идти по кругу.
Изменив на double вы исправили только это, однако введите "0.1blabla" - и всё зациклится вновь.
Решение:
1. Проверять std::cin на валидность if (std::cin) и, например, выходить, либо восстанавливать состояние:
if (!std::cin)
{
std::cin.clear(); // очищаем флаги
std::cin.ignore(INT_MAX, '\n'); // игнорим входной буфер до переноса строки
}
// можем пользоваться
2. Помимо этого можно попросить поток кидать исключения на ошибках, например:
std::cin.exceptions(std::ios::failbit);
Кинет исключение при неудачной попытке прочесть значение.
В вашем случае, я думаю, стоит проверять std::cin с игнорированием оставшегося ввода и восстанавливать состояние.