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

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

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

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


当前回答

您应该使用5000.0而不是5000。

其他回答

请尝试以下代码:

十进制值

decimal d1 = 3234.3434m;

转换为双精度

double r1 = Decimal.ToDouble(d1);

您应该使用5000.0而不是5000。

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

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是整数,它将执行整数除法,结果将是整数。

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

Opacity = trackBar1.Value / 5000.0;

你有两个问题。

首先,“不透明度”需要一个双精度值,而不是十进制值。编译器告诉您,虽然在十进制和双精度之间存在转换,但这是一个显式转换,您需要指定它才能工作。

其次,TrackBar.Value是一个整数值,将一个int除以一个int会得到一个int,无论您将其分配给哪种类型的变量。在这种情况下,存在从int到十进制或双精度的隐式转换,因为在进行转换时不会损失精度。所以编译器没有抱怨。但是你得到的值总是0,大概是因为trackBar.value总是小于5000。

解决方案是将代码更改为使用double(Opacity的原生类型),并通过显式地将常量设置为double来执行浮点运算,这将有助于提升算法或将trackBar.Value转换为double,这将执行相同的操作或两者兼而有之。除非在其他地方使用,否则不需要中间变量。我猜编译器无论如何都会优化它。

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