Java get fraction方法

时间:2014-04-17 12:22:51

标签: java fractions

我正在尝试创建一个返回十进制数的小数值的方法。

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

这两种方法与大多数值完美配合。例如,对于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整除,那么我必须以特定的方式生成一个分数。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,我担心它没有完整的解决方案。由于浮点数以有限的位数存储,因此不能表示所有分数,特别是那些不是十进制数的分数,如2/3。即使是十进制数,也不能表示所有数字。

换句话说,您的方法永远不会被2/3的浮点表示作为输入调用,因为此表示不存在。您可能会使用0.66666666调用(无论Java中的数字位数是多少),但这不是2/3 ...

有关Java中浮点表示的更多详细信息,请参阅此链接:http://introcs.cs.princeton.edu/java/91float/