将十进制转换为双倍?

Eggs McLaren 604 c# floating-point double decimal type-conversion

我想使用轨迹栏来改变窗体的不透明度.

这是我的代码:

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

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

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

我尝试使用trans,double但然后控件不起作用.这段代码在过去的VB.NET项目中运行良好.

Kevin Dente.. 418

像这样加倍的显式转换是没有必要的:

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

将常量标识为5000.0(或5000d)足够:

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


huseyint.. 120

通用问题"Decimal vs Double?"的更通用的答案:用于保证精度的货币计算的小数,用于不受小差异影响的科学计算的Double.由于Double是CPU本机的类型(内部表示存储在基数2中),因此使用Double执行的计算优于Decimal(在内部以10表示).


Keith.. 79

您的代码在VB.NET中运行良好,因为它隐式地执行任何转换,而C#同时具有隐式和显式.

在C#中,当你失去准确性时,从十进制到双精度的转换是明确的.例如1.1不能准确地表示为double,但可以作为小数(参见" 浮点数 - 比你想象的更不准确 "的原因).

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

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

(double)必须在C#中明确说明,但VB 可以暗示更"宽容"的编译器.


Gordon Bell.. 76

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

  • 这不会只是解决问题吗?而不是'5000`的问题,OP会有'100`的问题? (3认同)

tvanfosson.. 59

你有两个问题.首先,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;


andnil.. 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);


Ryan Fox.. 55

它听起来像是this.Opacity一个double值,编译器不喜欢你试图将十进制值塞入其中.


Dinah.. 46

你应该使用5000.0而不是5000.


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


ChrisF.. 44

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


Danny Fox.. 39

最好的解决方案是:

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


用户甲.. 38

既然Opacity是一个双倍的值,我会从一开始就使用一个双精度而不是完全投射,但一定要在分割时使用双精度,这样你就不会失去任何精度

Opacity = trackBar1.Value / 5000.0;


eaponz.. 33

this.Opacity = trackBar1.Value / 5000d;