40

したがって、数値の範囲が「0〜1024」で、それらを「0〜255」にしたい場合、数学では、入力を最大値(この場合は1024)で除算するように指示されます。私は0.0から1.0の間の数です。次に、これに宛先範囲(255)を掛けます。

それが私がやりたいことです!

しかし、何らかの理由で(Processingを使用して)Javaでは常に値0が返されます。

コードはこれと同じくらい簡単です

float scale;
scale = (n/1024) * 255;

しかし、私はちょうど0.0を取得します。doubleとintを試しました。すべて無駄に。どうして!?

4

6 に答える 6

74

整数除算をしているからです。

ダブルまたはフロートで除算すると、次のように機能します。

double scale = ( n / 1024.0 ) * 255 ;

または、フロートとして使用したい場合は、

float scale = ( n / 1024.0f ) * 255 ;
于 2010-09-23T14:51:23.130 に答える
19

n / 1024は整数除算であり、整数(つまり、この場合は0)を生成します。

n / 1024.0代わりに使用してください。

于 2010-09-23T14:51:49.287 に答える
7

だと思いnますint。定数1024と255は両方ともintsであるため、すべての右側の計算は整数演算で実行されています。n/1024の結果は、で乗算される前に整数値に切り捨てられることを意味し255ます。

これらの変更のいずれかにより、計算が正しく機能します。

scale = n / 1024.0 * 255.0;       // Use double constants.
scale = (double) n / 1024 * 255;  // Convert n to a double.
scale = n * 255 / 1024;           // Multiply before dividing.

最後のものはまだ整数数学を使用していますが、演算の順序を切り替えると、不要な切り捨てが0になりません。ただし、整数の回答しか得られないため、回答の小数点が失われます。

于 2010-09-23T14:52:43.357 に答える
2

最初に乗算を使用してnをfloatに自動キャストする必要があります。そうしないと、float間で操作を行う代わりに、整数演算を実行してから結果をキャストします。

float scale;
scale = n * 1.0 / 1024 * 255;
于 2010-09-23T14:52:01.830 に答える
2

あなたの場合n/1024、整数除算をしているので結果は0になります。これを克服するには、にキャストできnますfloat。これにより0.01.0次の間に結果が得られ、乗算し255て結果を整数に戻します。scaleまた、次のように宣言する必要がありますint

int scale;
int n = 80; 
scale = (int)(((float)n/1024) * 255);
于 2010-09-23T14:53:33.857 に答える
2

他の人はすでに素晴らしい答えを出しました。スケールを整数にしたい場合(nがすでに整数である場合は意味があります)、次のことができます。

int scale = ((255 * n)/1024);

最大n=1024の場合、n * 255は常にintに収まるため、これらが数値である限り、これで問題が発生することはないことに注意してください。

より柔軟になります

int scale(int value, int old_max, int new_max){
  java.math.BigInteger big_value = java.math.BigInteger.valueOf(value);
  java.math.BigInteger big_old_max = java.math.BigInteger.valueOf(old_max);
  java.math.BigInteger big_new_max = java.math.BigInteger.valueOf(new_max);
  java.math.BigInteger mult = big_value.multiply(big_old_max);
  return (int) mult.devide(big_new_max).doubleValue();
}

これは少し冗長であることを認めますが、この方法でintをオーバーフローさせることはありません

編集:

基本的に同じですが、不格好ではありません(ただし、数値が非常に大きい場合は、いくつかの精度エラーが発生する可能性があります)

int scale(int value, int old_max, int new_max){
  double factor = (double) new_max / (double) old_max;
  return factor * value;
}
于 2010-09-23T15:11:20.073 に答える