0

浮動小数点に問題があります。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 を掛けるかを決定しています。後で小数を切り捨てます。これで正しい答えが得られますが、正しいアプローチのように感じませんか? 誰かがこれを行う「正しい」方法を提案できますか?

4

1 に答える 1

1

実際、あなたはうまくやっています..しかし、入力が約である場合、これは失敗し11.56ます。ここであなたがする必要がありますcopOut.length() - 3

動的に使用するにはString#split()

String decLength = copOut.split("\\.")[1]; //this will result "56" (Actual string after decimal)

今、あなたはただする必要があります

while(a%1 != 0 && counter < decLength.length()){
        a *= 10;
        counter++;
    }

ループを削除する場合は、使用します

long d = (long)Math.pow(10,decLength.length());
 a=a*d;
于 2014-02-18T05:24:10.323 に答える