1

私は現在、ライブディスプレイのプレビューを必要とするプログラムを書いていますが、もちろん、プレビューは縮小されています。ただし、縮小PictureBoxするとサイズが正しくありません。スケールを正しくするには、幅と高さが4:3の比率である必要があります。コードは次のとおりです。

private void FindOptimalRes(PictureBox picBox)
{
    double h = Height / 4;
    double ratio = 4 / 3;
    picBox.Size = new Size((int)(h * ratio), (int)h);
}

テストでは、Height(フォームの高さ)は400なので、新しいサイズの幅は133になります。ただし、常に100×100にサイズ変更されます。なんで?

4

6 に答える 6

4

43は両方ともintsなので、になり1ます。それらを浮動小数点にする:

double ratio = 4.0 / 3.0;

あなたも同じ間違いを犯していることに注意してくださいHeight(今は問題ではありませんが、-に変更します4.0)。そして、これが実際のコードである場合、なぜ4で割って再び4を掛けるのですか?

private void FindOptimalRes(PictureBox picBox)
{
    picBox.Size = new Size(Height / 3, Height / 4);
}
于 2012-07-14T21:43:00.497 に答える
3

C#の計算は「正しい」です。何が行われているのかを理解することは..欠けています:-)

4 / 3(型の)式は、整数除算を使用しているため、整数値1int / intに評価されます(両方のオペランドは整数です)。結果の1は、割り当て時に暗黙的にdouble値に強制変換されます。

一方、適切な浮動小数点除算4d / 3を使用しているため、「機能」します(そして、結果として1.333_が2倍になります) 。double / intdouble / double (by promotion)double

同様に、Height / 4(高さが整数であると仮定して)の場合、これらは機能します。

(double)Height / 4          // double / int -> double
Height / 4d                 // int / double -> double
(double)Height / (double)4  // double / double -> double

ハッピーコーディング!

于 2012-07-14T21:42:57.550 に答える
3

あなたは整数除算をしています:

double ratio = 4 / 3; // evaluates to 1

小数点が切り捨てられているため、これでは探している値が得られ1ず、代わりにに評価され1.333ます。オペランドの少なくとも1つはdoubleである必要があります。

double ratio = 4.0 / 3.0; // evaluates to 1.333

同じことがHeight。をに変更44.0ます。

于 2012-07-14T21:43:05.377 に答える
2

除算の結果がdouble

double ratio = (double) 4 / 3; // double division 

入力値をdoubleに設定する必要はありません。

var num1 = // an integer number
var num2 = // an integer number

//result is integer, because of integer/integer uses 'integer division'
double result = num1 / num2; 

//result is double , because of you forced to 'double division'
double result = (double) num1 / num2;
于 2012-07-14T21:53:17.597 に答える
0

多分あなたは整数除算ではなく小数除算をするべきです:

double h = Height / 4.0;
double ratio = 4 / 3.0;

C#Mathがオフになっていると、世界中の多くのことがオフになります。

于 2012-07-14T21:43:05.043 に答える
0

あなたは整数除算をしています。

あなたがする必要があるのはこれです:

private void FindOptimalRes(PictureBox picBox)
{
    double h = Height / 4D; // or Height / 4.0
    double ratio = 4D / 3D; // or 4.0 / 3.0
    picBox.Size = new Size((int)(h * ratio), (int)h); // Size is now correct [133,100]
}

整数リテラル(小数点以下の桁数なし)を使用して数学演算を実行すると、暗黙的にintとして入力されます。

リテラル(4D、3D)の最後に大文字のDを追加するだけで、それらをdoubleとして入力し、計算が正しくなります。または、4.0、3.0と書くこともできます

于 2012-07-14T21:59:19.117 に答える