如何在C#中将Decimal转换为Double?

我想将十进制变量“trans”分配给双倍变量“this. Op洞察”。

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

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

无法隐式将类型decimal转换为Double

69233 次浏览

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

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

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

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

听起来this.Opacity是一个双精度值,编译器不喜欢你试图在其中塞进一个十进制值。

对于一般问题“十进制vs双?”的更通用的答案:

十进制用于货币计算以保持精度。双倍用于不受微小差异影响的科学计算。由于Double是CPU的原生类型(内部表示存储在基地2中),因此使用Double进行的计算比Decimal(内部表示在基地10中)执行得更好。

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

除了(或代替)将.0附加到数字之外,您可以使用decimal.ToDouble()

以下是一些例子:

// Example 1double transparency = trackBar1.Value/5000;this.Opacity = decimal.ToDouble(transparency);
// Example 2 - with inline tempthis.Opacity = decimal.ToDouble(trackBar1.Value/5000);

您的代码在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;}

您应该使用5000.0而不是5000

你有两个问题。

首先,Opacity需要一个双精度值,而不是十进制值。编译器告诉您,虽然有十进制和双精度之间的转换,但它是一个显式转换,您需要指定它才能正常工作。

其次,TrackBar.Value是一个整数值,无论你将int分配给什么类型的变量,将int除以int都会产生int。在这种情况下,会隐式地从int转换为decimal或double,因为进行转换时不会损失精度。所以编译器不会抱怨。但是你得到的值总是0,大概是因为trackBar.Value总是小于5000。

解决方案是将您的代码更改为使用Double(不透明度的本机类型)并通过显式地将常量设为Double来执行浮点运算,这将具有促进算术或将trackBar.Value转换为Double的效果,这将做同样的事情或两者兼而有之。除非在其他地方使用,否则您不需要中间变量。我的猜测是编译器无论如何都会优化它。

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

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

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显式将数字设为浮点值,编译器现在可以将其解释为双精度并执行正确的计算。

最好的解决方案是:

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

由于Opacity是一个双精度值,我将从一开始就使用一个双精度值,而不是强制转换,但一定要在除法时使用双精度值,这样你就不会丢失任何精度:

Opacity = trackBar1.Value / 5000.0;

尝试以下代码:

十进制值

decimal d1 = 3234.3434m;

转换为双倍

double r1 = Decimal.ToDouble(d1);

OG事实:Double类型代表了比Decimal更广泛的可能值。

双倍铸造

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

类型转换

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

无显式转换/转换

在这种情况下,在常量5000d或“.0”5000.0的末尾添加“d”将标识所需的Type。当操作中没有常量时,只需将您的decimal变量乘以1.01d