浮動小数点に問題があります。Aダブル。たとえば、Java の 56 は、実際には .56000...1 として格納される場合があります。
小数を分数に変換しようとしています。連分数を使ってこれをやろうとしました
しかし、その方法を使用した私の答えは、コンピューターで保存され丸められた小数の方法が原因で不正確でした。
別の方法を試しました:
public static Rational rationalize(double a){
if(a>= 1){
//throw some exception
}
String copOut = Double.toString(a);
int counter = 0;
System.out.println(a);
while(a%1 != 0 && counter < copOut.length() - 2){
a *= 10;
counter++;
}
long deno = (long)Math.pow(10,counter);//sets the denominator
Rational frac = new Rational((long)a,deno)//the unsimplified rational number
long gcd = frac.gcd();
long fnum = frac.getNumer();//gets the numerator
long fden = frac.getDenom();//gets the denominator
frac = new Rational(fnum/gcd, fden/gcd);
return frac;
}
文字列を使用して小数の長さを調べ、何回 10 を掛けるかを決定しています。後で小数を切り捨てます。これで正しい答えが得られますが、正しいアプローチのように感じませんか? 誰かがこれを行う「正しい」方法を提案できますか?