[英]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
我嘗試過使用trans
和double
,但是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.0
或1d
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.