2012-02-14 16 views
0

小数点以下2桁に切り捨てられた2つのdouble値があります。それぞれは、ラジアンサークル上の点を表し、目標値を見つけるまで、0.01で増減すると考えられています。ここでは、コードです:切り捨てられた倍精度浮動小数点型(forループ内のJavaで長い小数点以下を取得する

BigDecimal negPath = new BigDecimal(roundAndConvert(pendA.getTheta())); 
    BigDecimal posPath = new BigDecimal(roundAndConvert(pendA.getTheta())); 
    BigDecimal target = new BigDecimal(roundAndConvert(pendB.getTheta())); 
    for (negPath = negPath; ((negPath.doubleValue() > -0.01) && (!negPath.equals(target))); negPath = negPath.subtract(new BigDecimal(0.01))) {} 
    for (posPath = posPath; ((posPath.doubleValue() < 6.29) && (!posPath.equals(target))); posPath = posPath.add(new BigDecimal(0.01))) {} 

//here's the method that rounds the values 

public double roundAndConvert(double value) 
{ 
     double holder = (int)(value*100)/100.0; 
     if (holder < 0) 
     { 
      while (holder < -6.28) {holder += 6.28;} 
      holder += 6.28; 
     } 
     else 
     { 
      while (holder > 6.28) {holder -= 6.28;} 
     } 
     return holder; 
} 

私がいる問題は、2つのパスの値は、長い小数とダブルスを返すように似ていることである:彼らは好きではないされて返す値を

pos = 6.299999999999944 
neg = -0.01999999999996656 

これはforループの前にあるので、増分/減分と関係していると思います。

EDIT:doubleをBigDecimalsに置き換えようとしましたが、プログラムはforループでフリーズしています。パスの値としてstringCacheが表示されますが、それでも長い小数点があります。

EDIT:今度はBigDecimalのすべてのオブジェクトとforループのequalsを使用してコードを変更しましたが、私はまだ長い小数です。

EDIT:最後に示されたコーディングで作業しました。受け入れられた回答者は、私が間違っていたことを説明します。

for (negPath = negPath; ((negPath.doubleValue() > -0.01) && (!negPath.equals(new BigDecimal((int)(target.doubleValue()*100)/100.0)))); negPath = negPath.subtract(new BigDecimal(0.01))) 
    { 
     negPath = new BigDecimal((int)(negPath.doubleValue()*100)/100.0); 
    } 
    for (posPath = posPath; ((posPath.doubleValue() < 6.29) && (!posPath.equals(new BigDecimal((int)(target.doubleValue()*100)/100.0)))); posPath = posPath.add(new BigDecimal(0.01))) 
    { 
     negPath = new BigDecimal((int)(negPath.doubleValue()*100)/100.0); 
    } 
+0

この種の問題に特化したウェブサイト*があります:http://floating-point-gui.de/ –

答えて

3

あなたのコード:

for (negPath = negPath; 
     ((negPath.doubleValue() > -0.01) && (negPath.doubleValue() != target)); 
     negPath.subtract(new BigDecimal(0.01))) 
{} 

私はここ2つの、悪いエラーを参照してください。まず: - それらの各操作は、単に新しいものを作成しBigDecimalは不変であるため、

negPath.subtract(new BigDecimal(0.01)) 

negPath = negPath.subtract(new BigDecimal(0.01)) 

でなければなりません。これは、現在のループが終了しない理由です。各ループで状態が変わらないためです。

第二:ダブルスの比較

(negPath.doubleValue() != target) 

中間丸め - エラーが発生するのは非常に確信していると、条件のこの部分は決して真にはならないので、その方法は、無なしではありません。

理由:浮動小数点計算についてのいくつかの基本的なドキュメントを読んでください - 浮動小数点数は数学で知っているだけでなく、細心の注意を払って扱わなければなりません。

+0

もちろん!最初の問題は、ループがフリーズしている理由です。 –

+0

@DavidWallace:私は最初のバージョンを提出した直後にその答えを編集しました。 SOはこれを編集として表示しないので、ページをリロードするだけです。 –

+0

だから、BigDecimalsで 'equals'を使うとうまくいくでしょうか? – RaysonK

0

doubleの代わりにBigDecimalを使用してください。

+0

これはフリーズしています....コードを更新します – RaysonK

+0

@raysonk:完了するのに長い時間がかかるので、終了しない、またはフリーズしますか? 'BigDecimal'は' double'の約3倍のメモリを必要とし、少なくとも一桁以上はゆっくり動くことに注意してください。 –

+0

終了してはいけません。 BigDecimalを持たない別のメソッドを試してみましたが、同じことをしました。 – RaysonK

関連する問題