我想将十进制变量“trans”分配给双变量“this.Opacity”。
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建应用程序时,会出现以下错误:
无法将类型decimal隐式转换为double
我想将十进制变量“trans”分配给双变量“this.Opacity”。
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建应用程序时,会出现以下错误:
无法将类型decimal隐式转换为double
当前回答
听起来是这样的。不透明度是一个双值,编译器不喜欢你试图将一个十进制值塞进其中。
其他回答
不需要像这样显式转换为double:
double trans = (double) trackBar1.Value / 5000.0;
将常数确定为5000.0(或5000d)就足够了:
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
对于一般问题“十进制与双精度?”的更一般的答案:
小数用于货币计算以保持精度。Double用于不受微小差异影响的科学计算。由于Double是CPU固有的类型(内部表示形式存储在基数2中),因此使用Double进行的计算比Decimal(内部表示为基数10)执行得更好。
您的代码在VB.NET中运行良好,因为它隐式执行任何强制转换,而C#同时具有隐式和显式强制转换。
在C#中,从十进制到双精度的转换是显式的,因为您会丢失精度。例如,1.1不能准确地表示为双精度,但可以表示为十进制(请参阅“浮点数字-比您想象的更不准确”,了解原因)。
在VB中,编译器为您添加了转换:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
这(double)必须在C#中明确表示,但可以通过VB更“宽容”的编译器来暗示。
你为什么要除以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;
}
“不透明度”属性为双重类型:
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是整数,它将执行整数除法,结果将是整数。