Egg*_*ren 645 c# floating-point double decimal type-conversion
我想使用轨迹栏来改变窗体的不透明度.
这是我的代码:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Run Code Online (Sandbox Code Playgroud)
当我构建应用程序时,它会出现以下错误:
无法隐式转换
decimal
为double
.
我尝试使用trans
,double
但然后控件不起作用.这段代码在过去的VB.NET项目中运行良好.
Kev*_*nte 433
像这样加倍的显式转换是没有必要的:
double trans = (double) trackBar1.Value / 5000.0;
Run Code Online (Sandbox Code Playgroud)
将常量标识为double
(或5000.0
)足够:
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Run Code Online (Sandbox Code Playgroud)
hus*_*int 121
通用问题"Decimal vs Double?"的更通用的答案:用于保证精度的货币计算的小数,用于不受小差异影响的科学计算的Double.由于Double是CPU本机的类型(内部表示存储在基数2中),因此使用Double执行的计算优于Decimal(在内部以10表示).
Kei*_*ith 80
您的代码在VB.NET中运行良好,因为它隐式地执行任何转换,而C#同时具有隐式和显式.
在C#中,当你失去准确性时,从十进制到双精度的转换是明确的.例如1.1不能准确地表示为double,但可以作为小数(参见" 浮点数 - 比你想象的更不准确 "的原因).
在VB中,编译器为您添加了转换:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
Run Code Online (Sandbox Code Playgroud)
这(double)
必须在C#中明确说明,但VB 可以暗示更"宽容"的编译器.
Gor*_*ell 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;
}
Run Code Online (Sandbox Code Playgroud)
tva*_*son 60
你有两个问题.首先,Opacity
需要一个double,而不是十进制值.编译器告诉您,虽然十进制和双精度之间存在转换,但它是一个显式转换,您需要指定它才能使其工作.第二个是TrackBar.Value
整数值,无论您为其分配什么类型的变量,将int除以int都会得到一个int.在这种情况下,存在从int到decimal或double的隐式转换 - 因为在执行转换时没有精度损失 - 所以编译器不会抱怨,但是你得到的值总是0,大概是,因为trackBar.Value
总是小于5000.解决方案是将代码更改为使用double(Opacity的本机类型)并通过显式使常量为double来执行浮点运算 - 这将具有促进算术的效果 - 或者转换trackBar.Value
为double ,这将做同样的事情 - 或两者兼而有之.哦,除非在别处使用,否则你不需要中间变量.无论如何,我的猜测是编译器会优化它.
trackBar.Opacity = (double)trackBar.Value / 5000.0;
Run Code Online (Sandbox Code Playgroud)
and*_*nil 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);
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 45
该不透明度属性为双类型:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
Run Code Online (Sandbox Code Playgroud)
或者干脆:
this.Opacity = trackBar1.Value / 5000.0;
Run Code Online (Sandbox Code Playgroud)
要么:
this.Opacity = trackBar1.Value / 5000d;
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用5000.0
(或5000d
)强制进行双重除法,因为它trackBar1.Value
是一个整数,它将执行整数除法,结果将是一个整数.
Chr*_*isF 45
假设您使用的是WinForms,Form.Opacity
属于类型double
,因此您应该使用:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
Run Code Online (Sandbox Code Playgroud)
除非你需要其他地方的值,否则写起来更简单:
this.Opacity = trackBar1.Value / 5000.0;
Run Code Online (Sandbox Code Playgroud)
当您将代码更改为双精度时控件不起作用的原因是因为您有:
double trans = trackbar1.Value / 5000;
Run Code Online (Sandbox Code Playgroud)
这解释5000
为一个整数,因为trackbar1.Value
也是一个整数,你的trans
值总是为零.通过添加.0
编译器显式地使数字成为浮点值,编译器现在可以将其解释为double并执行正确的计算.
Dan*_*Fox 39
最好的解决方案是:
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Run Code Online (Sandbox Code Playgroud)
小智 39
既然Opacity
是一个双倍的值,我会从一开始就使用一个双精度而不是完全投射,但一定要在分割时使用双精度,这样你就不会失去任何精度
Opacity = trackBar1.Value / 5000.0;
Run Code Online (Sandbox Code Playgroud)
小智 8
尝试使用 cast 函数:
this.Opacity = decimal.ToDouble(trackBar1.Value / 5000.0);
Run Code Online (Sandbox Code Playgroud)