604


46

10進数を倍精度に変換しますか?

トラックバーを使用してフォームの不透明度を変更したいです。

これは私のコードです:

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

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

_ 型 '' decimal'`を ’double'`に暗黙的に変換することはできません。 _

私は trans`と double`を使ってみましたが、それからコントロールは機能しません。 このコードは過去のVB.NETプロジェクトで問題なく動作しました。

13 Answer


418


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

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

定数を 5000.0(または` 5000d`)として識別するだけで十分です。

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


120


一般的な質問 "Decimal vs Double?"に対するより一般的な答え:精度を維持するための通貨計算では* Decimal 、小さな違いの影響を受けない科学計算では Double *。 DoubleはCPU固有の型であるため(内部表現は_base 2_に格納されます)、Doubleを使用した計算はDecimal(内部的には_base 10_で表現されます)よりも優れたパフォーマンスを発揮します。


79


C#には暗黙的キャストと明示的キャストがありますが、暗黙的にキャストを行うため、VB.NETではあなたのコードは問題なく動作しました。

C#では、精度を失うので、10進数から倍精度値への変換は明示的です。 例えば1.1は正確にdoubleとして表現することはできませんが、decimalとして表現することができます( "http://bizvprog.blogspot.com/2008/05/floating-point-numbers-more-inaccurate.html"浮動小数点数を参照してください。 - あなたが思っている以上に不正確]

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

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

`(double)`はC#に明示的に記述されていなければなりませんが、VBのもっと '寛容な’コンパイラーによって暗黙のうちに指定することができます。


76


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

private void Form1_Load(オブジェクトセンダ、System.EventArgs e){TrackBar1.Minimum = 20; TrackBar1.Maximum = 100;

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

private void TrackBar1_Scroll(オブジェクト送信側、System.EventArgs e){this.Opacity = TrackBar1.Value / 100; }


59


2つ問題があります。 まず、 `Opacity`は10進数ではなく倍精度を必要とします。 コンパイラーは、10進数と倍精度数の間の変換がある一方で、それが機能するためには明示的な変換を指定する必要があると言っています。 2つ目は、 `TrackBar.Value`は整数値であり、intをintで除算すると、どんな変数に割り当ててもintになります。 この場合、暗黙的なint型からdecimalまたはdouble型へのキャストが行われます。これは、キャスト時に精度が低下することがないためです。したがって、コンパイラは文句を言いませんが、取得する値は常に0です。 .Value`は常に5000未満です。 解決策は、コードをdouble(Opacityのネイティブ型)を使うように変更し、定数を明示的にdoubleにすることで浮動小数点演算を行う - これは算術演算を促進する効果があります - あるいはtrackBar.Valueをdoubleにキャストする、それは同じことをするでしょう - あるいは両方。 ああ、あなたはそれが他の場所で使用されない限り、あなたは中間変数を必要としません。 とにかく、コンパイラがそれを最適化してしまうと私は思います。

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


57


私の意見では、できるだけ明確にすることが望ましいです。 これはコードに明快さを追加し、最終的にそれを読むかもしれないあなたの仲間のプログラマを助けます。

数字に .0`を追加することに加えて(あるいは代わりに)、 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);


55


これは `this.Opacity`がdouble値であるように聞こえます、そしてコンパイラはあなたがそれに10進値を詰め込もうとしているのが好きではありません。


46


5000`の代わりに 5000.0`を使うべきです。


45


Opacityプロパティは、double型です。

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

または単に:

this.Opacity = trackBar1.Value / 5000.0;

or:

this.Opacity = trackBar1.Value / 5000d;


44


WinFormsを使っていると仮定すると、http://msdn.microsoft.com/en-us/library/system.windows.forms.form.opacity.aspx [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として解釈して正しい計算を実行することができます。