Java метод получения дроби

Я пытаюсь создать метод, который возвращает дробное значение десятичного числа.

//these are included in a class called 'equazioni'

private static long getMCD(long a, long b) {
 if (b == 0)
  { return a; }
 else
  { getMCD(b, a % b); }
 }

public String getFraction(double a) {
 String s = String.valueOf(a);
 int decimali = s.length() - 1 - s.indexOf('.');        

 int den = 1;
 for(int i = 0; i < decimali; i++){
   a *= 10;
   den *= 10;
 }

 int num = (int) Math.round(a);
 long mcd = getMCD(num,den);

 return String.valueOf(num/mcd) + "/" + String.valueOf(den/mcd);
}

Эти 2 метода прекрасно работают с большинством значений. Например, при 8,65 возвращается 173/20, а при 78,24 возвращается 1956/25. Это называется так:

equazioni eq = new equazioni(a,b,c); 
jTextField4.setText("8.65= " + eq.getFraction(8.65));

У меня проблемы с дробями, такими как 2/3, 5/18, 6/45... потому что знаменатель делится на 3, и поэтому дробь является периодическим числом. Как я мог это представить?

Моя проблема также заключается в том, «Как я могу узнать, что это периодическое число?». Я думал, что я мог бы что-то вроде этого

int test = den % 3;

Если знаменатель делится на 3, то я должен составить дробь определенным образом. Любое предложение?


person Alberto Rossi    schedule 17.04.2014    source источник
comment
Вы можете проверить, является ли знаменатель или числитель простым числом? Я знаю, что это не все решение, но это место для начала поиска :)   -  person Pphoenix    schedule 17.04.2014
comment
Да, почему бы и нет :) Я пытался сделать это прямо сейчас, но я все еще думаю о самой большой части...   -  person Alberto Rossi    schedule 17.04.2014


Ответы (1)


Если я правильно понял ваш вопрос, боюсь, он не имеет полного решения. Поскольку число с плавающей запятой хранится с конечным числом битов, не все дроби могут быть представлены, особенно те, которые не являются десятичными числами, такими как 2/3. Даже для десятичных чисел не все они могут быть представлены.

Другими словами, ваш метод никогда не будет вызываться представлением с плавающей запятой 2/3 в качестве входных данных, поскольку это представление не существует. Вас могут вызвать с 0.66666666 (с любым ограничением цифр в Java), но это не 2/3...

См. эту ссылку для получения более подробной информации о представлении с плавающей запятой в Java: http://introcs.cs.princeton.edu/java/91float/

person Djizeus    schedule 17.04.2014