小数を倍精度に変換


671

を使用しTrack-Barて、Formの不透明度を変更します。

これは私のコードです:

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

アプリケーションをビルドすると、次のエラーが発生します。

暗黙的にタイプdecimalを変換できませんdouble

私が使って試してみましたtransし、doubleその後Controlは動作しません。このコードは、過去のVB.NETプロジェクトで問題なく機能しました。


11
また、DecimalはDoubleと同じ幅の値を表すことはできません。10進数は+/- 7.9228162514264337593543950335E + 28までしか使用できません。一方、ダブルは最大+/- 1.79769313486232E + 308
TraumaPony 2008


7
誰かがこれを重複としてマークする必要があります。
Ivan

7
@Ivan:これはこれまでに4番目に尋ねられた質問です...
ニコラス

1
@ニコラス:確かに。今日ここをたどった。
6月

回答:


446

このdoubleように明示的にキャストする必要はありません。

double trans = (double) trackBar1.Value / 5000.0;

定数として5000.0(またはとして5000d)識別することで十分です:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

123

一般的な質問「10進数かDoubleか?」に対するより一般的な答え:精度を維持するための通貨計算では10進数、小さな違いの影響を受けない科学計算ではDouble。DoubleはCPUにネイティブなタイプであるため(内部表現はbase 2に格納されます)、Doubleで行われた計算はDecimal(base 10で内部的に表現されます)よりもパフォーマンスが向上します。


83

コードはVB.NETで正常に機能しました。C#には暗黙的キャストと明示的キャストの両方があるのに対し、暗黙的にキャストが行われるためです。

C#では、精度が失われるため、10進数からdoubleへの変換は明示的です。たとえば、1.1はdoubleとして正確に表現できませんが、10進数として表現できます(理由については、「浮動小数点数-思ったよりも不正確」を参照してください)。

VBでは、コンパイラによって変換が追加されました。

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

これ(double)はC#で明示的に記述する必要がありますが、VBのより「寛容な」コンパイラーによって暗示される場合があります。


80

なぜ5000で割りますか?TrackBarの最小値と最大値を0から100の間に設定し、不透明度のパーセンテージとして値を100で割ります。以下の最低20の例は、フォームが完全に非表示になるのを防ぎます。

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}

5
これは単に問題を動かしませんか?5000OPに問題があるのではなく、OPに問題があり100ますか?
jww 2014

62

2つの問題があります。まず、Opacity10進数値ではなく、2倍値が必要です。コンパイラーは、10進数とdoubleの間の変換がある一方で、それが機能するために指定する必要がある明示的な変換であることを通知しています。2つ目はTrackBar.Value、整数値であり、intをintで除算すると、割り当てる変数のタイプに関係なくintになります。この場合、intからdecimalまたはdoubleへの暗黙的なキャストがあります-キャストを行っても精度が失われないため-コンパイラーは文句を言わないが、取得する値は常に0です。trackBar.Value解決策は、(不透明度のネイティブ型)をダブル使用するようにコードを変更することがあり、常に以下5000以上であると明示的に二重の定数を作ることによって浮動小数点演算でください-算術を促進する効果を持っているであろう-または鋳造trackBar.Valueダブルへ、同じことを実行します-または両方。ああ、そして、どこかで使用されない限り、中間変数は必要ありません。とにかく、コンパイラーはそれを最適化します。

trackBar.Opacity = (double)trackBar.Value / 5000.0;

58

私の意見では、できるだけ明確であることが望ましいです。これにより、コードが明確になり、最終的にコードを読む可能性がある他のプログラマーを支援します。

.0番号にa を追加することに加えて(またはその代わりに)、を使用できますdecimal.ToDouble()

ここではいくつかの例を示します。

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);


50

不透明度プロパティはdouble型です:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

または単に:

this.Opacity = trackBar1.Value / 5000.0;

または:

this.Opacity = trackBar1.Value / 5000d;

は整数であり、整数の除算を実行し、結果は整数になるため、5000.0(または5000d)を使用して二重除算を強制していることに注意してくださいtrackBar1.Value



47

WinForms Form.Opacityはタイプdoubleであると想定しているため、以下を使用する必要があります。

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

他の場所で値が必要でない限り、以下のように書くほうが簡単です。

this.Opacity = trackBar1.Value / 5000.0;

コードを単純にdoubleに変更したときにコントロールが機能しないのは、次の理由によります。

double trans = trackbar1.Value / 5000;

これ5000は整数として解釈されました。これは整数でtrackbar1.Valueもあるため、trans値は常にゼロでした。.0コンパイラを追加して明示的に数値を浮動小数点値にすることで、コンパイラはそれをdoubleとして解釈し、適切な計算を実行できます。



41

Opacityはdouble値なので、最初からdoubleを使用し、まったくキャストしませんが、精度を失うことがないように、除算時には必ずdoubleを使用してください。

Opacity = trackBar1.Value / 5000.0;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.