Терминология
В этом вопросе я вызываю "число с плавающей запятой" "десятичное число", чтобы предотвратить неоднозначность с примитивными типами данных float
/double
Java. Термин "десятичный" не имеет отношения к "основанию 10".
Фон
Я выражаю десятичное число любой базы таким образом:
class Decimal{
int[] digits;
int exponent;
int base;
int signum;
}
который приблизительно выражает это значение double
:
public double toDouble(){
if(signum == 0) return 0d;
double out = 0d;
for(int i = digits.length - 1, j = 0; i >= 0; i--, j++){
out += digits[i] * Math.pow(base, j + exponent);
}
return out * signum;
}
Я знаю, что некоторые преобразования невозможны. Например, преобразование 0.1 (base 3)
в базу 10 невозможно, поскольку оно является повторяющимся десятичным. Точно так же преобразование 0.1 (base 9)
в базу 3 невозможно, но возможно covnerting 0.3 (base 3)
. Вероятно, есть другие случаи, которые я не рассматривал.
Традиционный способ
Традиционный способ (вручную) изменения базы для целых чисел от основания 10 до основания 2 состоит в том, чтобы разделить число на показатели 2, а от основания 2 до основания 10 - умножить цифры на соответствующие показателями 2. Переход от основания x к основанию y обычно включает преобразование в основание 10 в качестве промежуточного элемента.
Первый вопрос: проверка аргумента
Поэтому мой первый вопрос заключается в том, что если я должен реализовать метод public Decimal Decimal.changeBase(int newBase)
, как я могу проверить, можно ли сделать newBase
без повторения десятичных знаков (что несовместимо с конструкцией поля int[] digits
, так как я не планирую создать поле int recurringOffset
только для этого.
Второй вопрос: реализация
Следовательно, как это реализовать? Я инстинктивно чувствую, что этот вопрос намного легче решить, если первый вопрос будет решен.
Третий вопрос: как насчет вывода повторяющихся номеров:
Я не планирую создавать поле
int recurringOffset
только для этого.
Для будущих читателей этот вопрос также следует задать.
Например, согласно Wolfram | Alpha:
0.1 (base 4) = 0.[2...] (base 9)
Как это можно вычислить (вручную, если по программированию звучит слишком сложно)?
Я думаю, что такая структура данных, как это, может представлять это десятичное число:
class Decimal{
int[] constDigits;
int exponent;
int base;
int signum;
@Nullable @NonEmpty int[] appendRecurring;
}
Например, 61/55
может быть выражен следующим образом:
{
constDigits: [1, 1], // 11
exponent: -1, // 11e-1
base: 10,
signum: 1, // positive
appendRecurring: [0, 9]
}
Не вопрос о домашнем задании
Я не ищу никаких библиотек. Пожалуйста, не отвечайте на этот вопрос со ссылкой на любые библиотеки. (потому что я пишу этот класс просто для удовольствия, ОК?)