协慌网

登录 贡献 社区

如何在 C#中将小数转换为双精度?

我想使用Track-Bar来更改Form的不透明度。

这是我的代码:

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

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

Cannot implicitly convert type decimal to double

我尝试使用transdouble ,但是Control不起作用。这段代码在过去的 VB.NET 项目中运行良好。

答案

不需要像这样的显式强制转换为double

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

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

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

通用问题 “十进制与双精度?” 的更通用答案:

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

您的代码在 VB.NET 中可以正常工作,因为它隐式地执行任何强制转换,而 C#同时具有隐式和显式强制转换。

在 C#中,由于精度下降,从十进制到双精度的转换是明确的。例如,1.1 不能准确地表示为双精度数,而可以精确地表示为十进制数(请参阅 “ 浮点数 - 比您想象的更不准确”,以了解原因)。

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

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

(double)必须在 C#中明确声明,但可以由 VB 更 “宽容” 的编译器隐含。