我想使用跟踪栏来更改表单的不透明度。

这是我的代码:

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

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

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

我尝试使用transdouble但是控件不起作用。 该代码在过去的VB.NET项目中运行良好。

===============>>#1 票数:428 已采纳

显式类型转换到double这样是没有必要的:

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

将常数标识为5000.0 (或5000d )就足够了:

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

===============>>#2 票数:121

通用问题“十进制与双精度?”的更通用答案: 十进制用于货币计算以保持精度, 精度用于科学计算,不受小差异的影响。 由于Double是CPU固有的类型(内部表示形式存储在基数2中 ),因此使用Double进行的计算要比Decimal(内部表示为基数10 )更好。

===============>>#3 票数:80

您的代码在VB.NET中可以正常工作,因为它隐式地执行任何强制转换,而C#同时具有隐式和显式强制转换。

在C#中,由于精度下降,从十进制到双精度的转换是明确的。 例如,1.1不能精确地表示为双精度数,而可以精确地表示为十进制数(请参阅“ 浮点数-比您想象的更不准确 ”,以了解原因)。

在VB中,编译器为您添加了转换:

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

(double)必须在C#中明确声明,但可以由VB更“宽容”的编译器隐含

===============>>#4 票数:77

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

===============>>#5 票数:60

你有两个问题。 首先, Opacity需要双精度值,而不是十进制值。 编译器告诉您,虽然在十进制和双精度之间进行了转换,但这是您需要指定的显式转换,以使其起作用。 第二个原因是TrackBar.Value是一个整数值,将int除以int都会得到int,无论您将变量分配给哪种类型。 在这种情况下,存在从int到十进制或double的隐式转换-因为在进行转换时不会损失精度-因此编译器不会抱怨,但是您获得的值始终是0(大概是因为trackBar.Value始终小于5000。解决方案是将代码更改为使用double(不透明度的本机类型),并通过将常量显式设置为double来进行浮点算术-这将促进算术的效果-或强制转换trackBar.Value翻倍,这将做相同的事情-或两者兼而有之。 哦,您不需要中间变量,除非在其他地方使用了中间变量。 我的猜测是,无论如何编译器都会对其进行优化。

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

===============>>#6 票数: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);

===============>>#7 票数:55

听起来像是这样:不this.Opacity是一个双this.Opacity值,编译器不喜欢您尝试将十进制值填充到其中。

===============>>#8 票数:47

您应该使用5000.0而不是5000

===============>>#9 票数:45

不透明度属性为双精度类型:

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

或者简单地:

this.Opacity = trackBar1.Value / 5000.0;

要么:

this.Opacity = trackBar1.Value / 5000d;

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

===============>>#10 票数:45

假设您使用的是WinForms, Form.Opacity的类型为double ,因此您应该使用:

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

除非您在其他地方需要该值,否则编写起来会更简单:

this.Opacity = trackBar1.Value / 5000.0;

当您将代码更改为简单的两倍时,该控件不起作用的原因是:

double trans = trackbar1.Value / 5000;

它将5000解释为整数,并且因为trackbar1.Value也是整数,所以您的trans值始终为零。 通过将数字加.0明确地使数字成为浮点值,编译器现在可以将其解释为double并执行适当的计算。

===============>>#11 票数:39

由于Opacity是一个双精度值,因此我从一开始就只使用一个双精度而不进行任何转换,但是在除法时一定要使用双精度,这样就不会损失任何精度

Opacity = trackBar1.Value / 5000.0;

===============>>#12 票数:39

最好的解决方案是:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

===============>>#13 票数:33

this.Opacity = trackBar1.Value / 5000d;

  ask by community wiki translate from so

未解决问题?本站智能推荐:

关注微信公众号