如何在C#中将十进制转换为双精度?

How to convert Decimal to Double in C#?

提问人: 提问时间:8/1/2008 最后编辑:50 revs, 37 users 8%Eggs McLaren 更新时间:9/8/2022 访问量:74761

问:

我想将十进制变量“trans”分配给双精度变量“this。不透明度”。

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

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

无法将类型十进制隐式转换为双精度

C# 浮点 类型转换 十进制

评论

20赞 TraumaPony 9/21/2008
此外,Decimal 不能表示与 Double 一样宽的值。十进制只能达到 +/-7.9228162514264337593543950335E+28;而双倍可以达到 +/-1.79769313486232E+308
4赞 Franck 2/24/2021
@TraumaPony这是一个.不太可能在trackbartrackbar
6赞 JosephDoggie 5/20/2021
我总是被告知乘以 0.0002 比除以 5000 更好。
1赞 Peter Mortensen 8/16/2022
trans”可能是“透明度”的意思(来自答案?),与不透明度相反,由变量名称“Opacity”表示。

答:

529赞 Kevin Dente 8/1/2008 #1

像这样明确的强制转换是没有必要的:double

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

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

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
68赞 Ryan Fox 8/1/2008 #2

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

152赞 huseyint 8/1/2008 #3

对于一般问题“十进制与双精度?”,一个更通用的答案:

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

72赞 andynil 8/6/2008 #4

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

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

以下是一些示例:

// Example 1
double transparency = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transparency);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
107赞 Keith 8/11/2008 #5

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

在 C# 中,从十进制到双精度的转换是显式的,因为您会失去准确性。例如,1.1 不能准确地表示为双精度,但可以表示为小数(有关原因,请参阅“浮点数 - 比您想象的更不准确”)。

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

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

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

96赞 Gordon Bell 9/21/2008 #6

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

评论

9赞 jww 9/23/2014
这难道不只是转移问题吗?与其说是问题,不如说是 OP 的问题?5000100
64赞 Dinah 11/20/2008 #7

您应该使用代替 .5000.05000

77赞 tvanfosson 2/27/2009 #8

你有两个问题。

首先,需要双精度值,而不是十进制值。编译器告诉您,虽然在十进制和双精度之间进行了转换,但您需要指定这种转换才能使其正常工作。Opacity

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

解决方案是将代码更改为使用 double(Opacity 的本机类型),并通过显式使常量为 double 来执行浮点运算,这将产生将算术或强制转换为 double 的效果,这将执行相同的操作或两者兼而有之。除非在其他地方使用中间变量,否则不需要中间变量。我的猜测是编译器无论如何都会对其进行优化。trackBar.Value

trackBar.Opacity = (double)trackBar.Value / 5000.0;
64赞 Darin Dimitrov 9/1/2011 #9

Opacity 属性是 double 类型:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

或者简单地说:

this.Opacity = trackBar1.Value / 5000.0;

艺术

this.Opacity = trackBar1.Value / 5000d;

请注意,我使用 (or ) 强制进行双除法,因为 trackBar1.Value 是一个整数,它将执行整数除法,结果将是一个整数。5000.05000d

59赞 ChrisF 9/1/2011 #10

假设您使用的是 WinForms,则 Form.Opacity 的类型为 ,因此您应该使用:double

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

除非在其他地方需要该值,否则编写起来更简单:

this.Opacity = trackBar1.Value / 5000.0;

当您将代码更改为仅为双精度时,控件不起作用的原因是:

double trans = trackbar1.Value / 5000;

它解释为整数,并且因为也是一个整数,所以你的值始终为零。通过添加显式使数字成为浮点值,编译器现在可以将其解释为双精度值并执行正确的计算。5000trackbar1.Valuetrans.0

52赞 Danny Fox 3/6/2012 #11

最好的解决方案是:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
53赞 Darryl 5/13/2012 #12

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

Opacity = trackBar1.Value / 5000.0;
3赞 2 revs, 2 users 77%David Rodrigues #13

OG 事实:type 表示比 更宽范围的可能值。DoubleDecimal

铸造为替身

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

类型转换

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

无显式强制转换

在这种情况下,在常量或“.0”的末尾添加“d”将标识所需的类型。当运算中没有常量时,只需将变量乘以 或 即可。5000d5000.0decimal1.01d

评论

0赞 Peter Mortensen 8/16/2022
什么是“OG”?是“原始黑帮的首字母缩写;与最早的黑帮说唱时代有关的人。推而广之,美国,俚语,任何与更早、更传统、更真实的时代相关的事物。还是别的什么?
0赞 David Rodrigues 8/24/2022
@PeterMortensen Old & Gold