Поскольку вы хотите избежать приведений, вот арифметический способ, предполагающий, что вам нужно иметь дело только с положительными числами:
List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
int mostSignificantDigit = (int) current;
piList.add(mostSignificantDigit);
current = (current - mostSignificantDigit) * 10;
}
Обработка отрицательных чисел может быть легко осуществлена сначала путем проверки знака, а затем с использованием того же кода с current = Math.abs(pi)
.
Обратите внимание, что из-за арифметики с плавающей запятой она даст вам результаты, которые вы можете не ожидать для значений, которые не могут быть полностью представлены в двоичном виде.
Здесь - это идеон, который иллюстрирует проблему и где вы можете попробовать мой код.