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

这是我的代码:

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

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

无法隐式转换类型 'decimal''double'.

我尝试使用 transdouble 但随后控制不起作用。这段代码在过去的 VB.NET 项目中运行良好。

有帮助吗?

解决方案

像这样的显式转换为 double 是不必要的:

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

将常数识别为 5000.0 (或作为 5000d) 足够了:

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

其他提示

对于通用问题“十进制与双精度?”的更通用答案: 十进制 对于货币计算以保持精度, 双倍的 用于不受微小差异影响的科学计算。由于 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;
}

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

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

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

除了(或代替)附加 .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);

这听起来像 this.Opacity 是一个双精度值,编译器不喜欢您尝试向其中塞入十进制值。

你应该使用 5000.0 代替 5000.

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

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

假设您使用的是 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 并执行正确的计算。

最好的解决方案是:

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

自从 Opacity 是一个双精度值,我从一开始就使用双精度值,根本不进行强制转换,但一定要在除法时使用双精度值,这样就不会丢失任何精度

Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top