Question

I am trying to make a method that returns the fractional value of a decimal number.

//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);
}

These 2 methods works perfectly with most of values. For example with a 8.65 it returns a 173/20, or 78.24 it returns a 1956/25. It's called in this way:

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

I am having troubles with fractions like 2/3, 5/18, 6/45... because the denominator is divisible by 3 and so the fraction is a periodic number. How could I represent it?

My problem is also "How could I recognize that it's a periodic number?". I thought that I could something like this

int test = den % 3;

If the denominator is divisible by 3, then I have to generate a fraction in a particular way. Any suggestion?

Was it helpful?

Solution

If I correctly understood your question, I am afraid it does not have a complete solution. Since a float is stored with a finite number of bits, not all fractions can be represented, especially the ones that are not decimal numbers like 2/3. Even for decimal numbers, not all of them can be represented.

In other words, your method will never be called by the float representation of 2/3 as an input, since this representation does not exist. You might be called with 0.66666666 (with whatever the limit of digits would be in Java), but that is not 2/3...

See this link for more details about floating point representation in Java: http://introcs.cs.princeton.edu/java/91float/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top