我想将十进制变量“trans”分配给双变量“this.Opacity”。

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

当我构建应用程序时,会出现以下错误:

无法将类型decimal隐式转换为double


当前回答

你为什么要除以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;
}

其他回答

在我看来,尽可能明确是可取的。这增加了代码的清晰度,并有助于最终可能阅读它的程序员同事。

除了(或代替)在数字后面附加一个.0,还可以使用decimal.ToDouble()。

以下是一些示例:

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

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

请尝试以下代码:

十进制值

decimal d1 = 3234.3434m;

转换为双精度

double r1 = Decimal.ToDouble(d1);

对于一般问题“十进制与双精度?”的更一般的答案:

小数用于货币计算以保持精度。Double用于不受微小差异影响的科学计算。由于Double是CPU固有的类型(内部表示形式存储在基数2中),因此使用Double进行的计算比Decimal(内部表示为基数10)执行得更好。

由于“不透明度”是一个双精度值,我将从一开始就使用双精度,而不进行强制转换,但在除法时一定要使用双精度值以便不会丢失任何精度:

Opacity = trackBar1.Value / 5000.0;

“不透明度”属性为双重类型:

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

或者简单地:

this.Opacity = trackBar1.Value / 5000.0;

or:

this.Opacity = trackBar1.Value / 5000d;

请注意,我使用5000.0(或5000d)强制进行二次除法,因为trackBar1.Value是整数,它将执行整数除法,结果将是整数。