簡體   English   中英

如何在 C# 中將 Decimal 轉換為 Double?

[英]How to convert a Decimal to a Double in 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 進行的計算比 Decimal (內部以10 為基數表示)執行得更好。

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

你有兩個問題。

首先, Opacity需要雙精度值,而不是十進制值。 編譯器告訴您,雖然十進制和雙精度之間存在轉換,但您需要指定顯式轉換才能使其工作。

其次, TrackBar.Value是一個整數值,並且將一個 int 除以一個 int 會得到一個 int,無論您將它分配給什么類型的變量。 在這種情況下,存在從 int 到 decimal 或 double 的隱式轉換,因為在進行轉換時不會損失精度。 所以編譯器不會抱怨。 但是你得到的值總是 0,大概是因為trackBar.Value總是小於 5000。

解決方案是將您的代碼更改為使用雙精度(不透明度的本機類型)並通過顯式將常量設為雙精度來執行浮點運算,這將具有提升算術或將trackBar.Value為雙精度的效果,這樣就可以了同一件事或兩者兼而有之。 您不需要中間變量,除非它在其他地方使用。 我的猜測是編譯器無論如何都會優化它。

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

在我看來,希望盡可能明確。 這增加了代碼的清晰度,並有助於最終可能閱讀它的程序員伙伴。

除了(或代替)將.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);

聽起來像this.Opacity是一個 double 值,編譯器不喜歡你試圖將一個十進制值塞進它。

Opacity屬性是雙重類型:

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是一個整數,它將執行整數除法,結果將是一個整數。

您應該使用5000.0而不是5000

假設您使用的是 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顯式使數字成為浮點值,編譯器現在可以將其解釋為雙精度並執行正確的計算。

由於Opacity是一個雙精度值,我會從一開始就使用雙精度值,根本不進行轉換,但請務必在除法時使用雙精度值,以免丟失任何精度

Opacity = trackBar1.Value / 5000.0;

最好的解決方案是:

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

嘗試使用 cast 函數:

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

嘗試將其轉換為像這樣的 double:

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

嘗試這個 -

//十進制值

decimal d1 = 3234.3434m;

// 轉換為雙精度

double r1 = Decimal.ToDouble(d1);

OG Fact: Double類型表示比Decimal更廣泛的可能值范圍。

鑄造為雙重

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

類型轉換

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

沒有明確的投射/轉換

在這種情況下,在常量5000d或“.0” 5000.0的末尾添加“d”將標識所需的類型。 當操作中沒有常數時,只需將您的decimal變量乘以1.01d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM