2011-12-08 14 views
5

試探一下我可以忽略的東西,但是這個問題讓我非常惱火。 即時嘗試從數據集中獲取一個值,然後用它來做一些計算。數據集中的 被視爲一個對象,所以我需要將它轉換爲int或double。 出於某種原因,我得到一個愚蠢的錯誤,讓我的神經。繼承人的代碼。c#轉換錯誤(infinte值....什麼?)

private void SpendsAnalysis() 
    { 
     float tempQty = 0; 
     float tempPrice = 0; 
     double tempTot = 0; 
     double total = 0; 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      tempQty = (float)row.Cells["Qty"].Value; 
      tempPrice = (float)row.Cells["Unit"].Value; 

      tempTot = tempQty * tempPrice; 
      total += tempTot; 
     } 

     textBox7.Text = total.ToString(); 
    } 

引發:「指定的轉換無效。」 (System.InvalidCastException) 當鑄造一個數字時,必須小於inifnite。這是我得到的令人討厭的錯誤。現在我從我的數據集中獲取數據,從存儲過程獲取數據。 我相信「數量」字段類型是貨幣(是的,爲什麼是數量貨幣哈哈,而不是我的表!)。在我的datagrid視圖中它看起來像1.000,這是由於類型轉換?我將如何糾正這一點? 很多感謝提前!

+4

'float'肯定比'currency'或'小數較差的匹配'。但你聽起來應該是一個整數。貨幣計算中出現的任何'float'/'double'都是一個大紅旗。 – CodesInChaos

+0

同意,但這些是由原始表格設置的值。即時將它鑄造爲一個值,我可以使用它,雙倍或浮動 – lemunk

+0

爲什麼不是'十進制'?你可以在C#中使用十進制數,這當然是比'float'或'double'更好的選擇。 – CodesInChaos

回答

9

一個類型轉換有成功,不幸的是,直接從object強制轉換爲不同的類型的基本對象是行不通的,即使從decimal(爲currency的.NET類型)轉換成一float通常會工作。

如果數據庫類型爲currency,我想試試這個:

= (float)(decimal)row.Cells["Qty"].Value; 

,或者您可以使用this

= Convert.ToSingle(row.Cells["Qty"].Value); 

將看看實際值與圖出正確的轉換類型來執行。

爲了回答您的評論,上述表達式涉及兩個不同的轉換:

  • object拆箱轉換爲數值型,在這種情況下,以一個decimal
  • 的顯式轉換從decimalfloat

第一個拆箱轉換記錄在C#語言規範部分4.3.2(這是C# 4.0 specification ):

解包操作以不可爲空值型由第一檢查所述對象實例是給定的非可空值型的裝箱值,並然後複製的值脫離實例。

(我的重點)

我也有規範的註釋版本,並埃裏克利珀總結了如下:

雖然是合法的,未裝箱INT轉換爲unboxed double,將盒裝int轉換爲unboxed double-only轉換爲unboxed int是不合法的。

6.2.1顯式數值轉換
顯式數值轉換是從一個所述轉換:

第二,顯式轉換,在C#語言規範6.2.1節進行了說明數字類型爲隱式數字轉換(第6.1.2節)尚不存在的另一數字類型:
...
十進制到sbyte,byt e,short,ushort,int,uint,long,ulong,char,float,或double。

(再次,我的重點)

總結:

  • 當從object到價值型 「鑄造」,你實際上拆箱裝箱值,和您首先必須將實際的基礎值解開爲正確的類型,然後才能將其轉換爲其他類型。
+0

hmmmmm有趣 – lemunk

+0

啊很多感謝convert.tosingle作品一個治療,所以它事實上它的一個對象,這意味着它不能轉換?有沒有關於這方面的信息? – lemunk

+3

說完了我想在我的回答中說的一句話,你確定你想把它當作'float'而不是'decimal'嗎? –