Convert Decimal to Double?

c# floating-point type-conversion double decimal

42136 观看

13回复

942 作者的声誉

I want to use a track-bar to change a form's opacity.

This is my code:

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

When I build the application, it gives the following error:

Cannot implicitly convert type 'decimal' to 'double'

I tried using trans and double but then the control doesn't work. This code worked fine in a past VB.NET project.

作者: Eggs McLaren 的来源 发布者: 2008 年 7 月 31 日

回应 (13)


424

15553 作者的声誉

决定

An explicit cast to double like this isn't necessary:

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

Identifying the constant as 5000.0 (or as 5000d) is sufficient:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
作者: Kevin Dente 发布者: 31.07.2008 10:17

55

7951 作者的声誉

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

作者: Ryan Fox 发布者: 01.08.2008 01:53

121

11421 作者的声誉

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

作者: huseyint 发布者: 01.08.2008 02:23

57

23017 作者的声誉

在我看来,希望尽可能明确。这增加了代码的清晰度,并帮助最终可能阅读它的程序员。

除了(或代替)附加.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);
作者: andnil 发布者: 05.08.2008 08:18

80

98280 作者的声誉

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

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

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

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

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

作者: Keith 发布者: 10.08.2008 05:54

77

11237 作者的声誉

你为什么要除以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;
}
作者: Gordon Bell 发布者: 21.09.2008 03:51

47

26376 作者的声誉

你应该使用5000.0而不是5000

作者: Dinah 发布者: 20.11.2008 02:36

60

439417 作者的声誉

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

trackBar.Opacity = (double)trackBar.Value / 5000.0;
作者: tvanfosson 发布者: 27.02.2009 11:45

45

868468 作者的声誉

不透明度属性为双类型:

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

作者: Darin Dimitrov 发布者: 31.08.2011 07:08

45

117177 作者的声誉

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

作者: ChrisF 发布者: 31.08.2011 07:09

39

11762 作者的声誉

最好的解决方案是:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
作者: Danny Fox 发布者: 06.03.2012 08:07

39

459 作者的声誉

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

Opacity = trackBar1.Value / 5000.0;
作者: Darryl 发布者: 13.05.2012 02:10

33

336 作者的声誉

this.Opacity = trackBar1.Value / 5000d;
作者: eaponz 发布者: 11.04.2013 03:08
32x32