Convert Decimal to Double?
我想使用跟踪栏更改窗体的不透明度。
这是我的代码:
1 2 | decimal trans = trackBar1.Value / 5000; this.Opacity = trans; |
当我构建应用程序时,它会给出以下错误:
Cannot implicitly convert type
'decimal' to'double' .
我试过使用
不需要像这样显式转换为double:
1 | double trans = (double) trackBar1.Value / 5000.0; |
将常数标识为
1 2 | double trans = trackBar1.Value / 5000.0; double trans = trackBar1.Value / 5000d; |
对一般性问题"十进制与双精度"的更一般的回答。:小数表示货币计算以保持精度,两倍表示不受小差异影响的科学计算。由于double是CPU本身的一种类型(内部表示法存储在基2中),因此使用double进行的计算比使用decimal(内部表示法为基10)执行得更好。
您的代码在vb.net中工作得很好,因为它隐式地执行任何类型转换,而C同时具有隐式和显式两种类型。
在C中,从十进制到double的转换是明确的,因为您会失去准确性。例如,1.1不能准确地表示为双精度数,但可以表示为十进制数(请参阅"浮点数-比您想象的更不准确"了解原因)。
在VB中,编译器为您添加了转换:
1 2 | decimal trans = trackBar1.Value / 5000m; this.Opacity = (double) trans; |
你为什么除以5000?只需将轨迹条的最小值和最大值设置为0到100,然后将不透明度百分比的值除以100。以下至少20个示例可防止窗体完全不可见:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; } |
你有两个问题。首先,
1 | trackBar.Opacity = (double)trackBar.Value / 5000.0; |
在我看来,最好尽可能明确。这增加了代码的清晰度,并帮助您的程序员同事最终阅读它。
除了(或代替)在数字上附加一个
以下是一些例子:
1 2 3 4 5 6 | // Example 1 double transperancy = trackBar1.Value/5000; this.Opacity = decimal.ToDouble(transperancy); // Example 2 - with inline temp this.Opacity = decimal.ToDouble(trackBar1.Value/5000); |
听起来
你应该使用
假设您使用的是WinForms,那么
1 2 | double trans = trackBar1.Value / 5000.0; this.Opacity = trans; |
除非您在其他地方需要该值,否则编写:
1 | this.Opacity = trackBar1.Value / 5000.0; |
当您将代码更改为简单的double时,控件不起作用的原因是:
1 | double trans = trackbar1.Value / 5000; |
它将
不透明度属性为双类型:
1 2 | double trans = trackBar1.Value / 5000.0; this.Opacity = trans; |
或者简单地说:
1 | this.Opacity = trackBar1.Value / 5000.0; |
或:
1 | this.Opacity = trackBar1.Value / 5000d; |
注意,我使用
因为
1 | Opacity = trackBar1.Value / 5000.0; |
最好的解决方案是:
1 | this.Opacity = decimal.ToDouble(trackBar1.Value/5000); |
1 | this.Opacity = trackBar1.Value / 5000d; |