我想将十进制变量“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
当前回答
最佳解决方案是:
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
其他回答
OG事实:Double类型表示比Decimal更广泛的可能值。
铸造为双重
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
类型转换
decimal trans = trackBar1.Value / 5000m;
this.Opacity = decimal.ToDouble(trans);
无显式强制转换/转换
在这种情况下,在常量5000d或“.0”5000.0的末尾添加“d”将标识所需的类型。当运算中没有常数时,只需将十进制变量乘以1.0或1d。
不需要像这样显式转换为double:
double trans = (double) trackBar1.Value / 5000.0;
将常数确定为5000.0(或5000d)就足够了:
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
您的代码在VB.NET中运行良好,因为它隐式执行任何强制转换,而C#同时具有隐式和显式强制转换。
在C#中,从十进制到双精度的转换是显式的,因为您会丢失精度。例如,1.1不能准确地表示为双精度,但可以表示为十进制(请参阅“浮点数字-比您想象的更不准确”,了解原因)。
在VB中,编译器为您添加了转换:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
这(double)必须在C#中明确表示,但可以通过VB更“宽容”的编译器来暗示。
对于一般问题“十进制与双精度?”的更一般的答案:
小数用于货币计算以保持精度。Double用于不受微小差异影响的科学计算。由于Double是CPU固有的类型(内部表示形式存储在基数2中),因此使用Double进行的计算比Decimal(内部表示为基数10)执行得更好。
你有两个问题。
首先,“不透明度”需要一个双精度值,而不是十进制值。编译器告诉您,虽然在十进制和双精度之间存在转换,但这是一个显式转换,您需要指定它才能工作。
其次,TrackBar.Value是一个整数值,将一个int除以一个int会得到一个int,无论您将其分配给哪种类型的变量。在这种情况下,存在从int到十进制或双精度的隐式转换,因为在进行转换时不会损失精度。所以编译器没有抱怨。但是你得到的值总是0,大概是因为trackBar.value总是小于5000。
解决方案是将代码更改为使用double(Opacity的原生类型),并通过显式地将常量设置为double来执行浮点运算,这将有助于提升算法或将trackBar.Value转换为double,这将执行相同的操作或两者兼而有之。除非在其他地方使用,否则不需要中间变量。我猜编译器无论如何都会优化它。
trackBar.Opacity = (double)trackBar.Value / 5000.0;