2016-03-21 11 views
0

私の質問を公式化する方法は本当にわかりませんが、悪い試みです。 私がやりたいことは、基本的にuserinputのサインをdouble値で置き換えることです。リプレイスプロセスは今のところ関連性がありません。私の問題はリプレイスメントを計算する際に発生します。例えば負の数と正の数を持つ数字の行を想像してみてください。 -5から5まで(maxXは10となります)。 私の必要とされる置換の間のステップ幅としてscaleを想像してください。だから私が計算する必要がある置換は:-5.0, -4.8, -4.6, -4.4, [...], 4.4, 4.6, 4.8, 5.0(原因:n/scale = 0/5, 1/5, 2/5 [...])です。 (単に計算のため) はHERESに私のコード:数字の行で正と負の値を計算する

int maxX = 10; 
int scale = 5; 

public void rep(){ 
double rep = 0; 
int n = 0; 
for (int k = (-maxX/2)*scale; k <= (maxX/2)*scale; k++){ 

    if (k < 0){ 
     rep = (double) n/scale +((int) ((k)/scale)); 
     System.out.println("k: "+k+"    "+rep); 
    } 

    if (k >= 0){ 
     rep = (double) n/scale +((int) ((k)/scale)); 
     System.out.println("k: "+k+"    "+rep); 
    } 

    if (n < scale-1){ 
     n++; 
    } else { 
     n = 0; 
    } 

    } 
} 

それはk => 0の結果は、要件に合わせ、正常に動作しますが、彼らは間違っているのでk < 0の結果unfourtunatley私のニーズをsatifyません(コンソールoutprint ):そうk < 0ための出力が-5.0, -4.8, -4.6, -4.4, [...]にマッチします変更するにはどう

k: -25    -5.0 // correct 
k: -24    -3.8 // wrong 
k: -23    -3.6 // wrong 
k: -22    -3.4 // wrong 
k: -21    -3.2 // wrong 
k: -20    -4.0 // correct 
k: -19    -2.8 
k: -18    -2.6 
k: -17    -2.4 
k: -16    -2.2 
k: -15    -3.0 
k: -14    -1.8 
k: -13    -1.6 
k: -12    -1.4 
k: -11    -1.2 
k: -10    -2.0 
k: -9    -0.8 
k: -8    -0.6 
k: -7    -0.4 
k: -6    -0.19999999999999996 
k: -5    -1.0 
k: -4    0.2 
k: -3    0.4 
k: -2    0.6 
k: -1    0.8 
k: 0    0.0 
k: 1    0.2 
k: 2    0.4 
k: 3    0.6 
k: 4    0.8 
k: 5    1.0 
k: 6    1.2 
k: 7    1.4 
k: 8    1.6 
k: 9    1.8 
k: 10    2.0 
k: 11    2.2 
k: 12    2.4 
k: 13    2.6 
k: 14    2.8 
k: 15    3.0 
k: 16    3.2 
k: 17    3.4 
k: 18    3.6 
k: 19    3.8 
k: 20    4.0 
k: 21    4.2 
k: 22    4.4 
k: 23    4.6 
k: 24    4.8 
k: 25    5.0 

、私はそれのまわりで私の頭をラップ傾けます。ありがとうございました。

+0

あなたのすべての整数は順不同です。独自のコードを実行すると、その理由がわかります。 –

+0

問題は整数計算を使用しているため、すべての結果が切り捨てられることです。 -24/5は-4に切り捨てられ、0.2を加えると-3.8となります。とにかくそれをどうして計算するのですか?最大値に達するまで、各繰り返しでステップサイズを追加するだけではどうですか? for(double v = -maxX/2; v <= maxX/2; v + = 1.0/scale)のようなもの{System.out.println(v); } ' – Thomas

+0

さて、わかりました、それは理にかなっています。 -25 <= k <-20の場合、この計算の整数値を-5にする必要があるため、修正しました。 – Zi1mann

答えて

1

コードを使用する場合は、(k)/scaleの代わりに(int)Math.floor((double)k/scale)を試してください。

Altnerativelyあなただけのループで1 /スケールをアップ追加することができますが原因精度の問題のために、あなたはBigDecimalのを使用する必要があるだろう:

int maxX = 10; 
int scale = 5; 
BigDecimal start = BigDecimal.valueOf(-maxX/2); 
BigDecimal end = BigDecimal.valueOf(maxX/2); 
BigDecimal step = BigDecimal.valueOf(1.0/scale); 
for(BigDecimal v = start; v.compareTo(end) <= 0; v = v.add(step)) 
{ 
    System.out.println("k:" + v.multiply(BigDecimal.valueOf(scale)).intValue() + " " + v); 
} 
関連する問題