[英]What is the proper way to get an int from a float?
我遇到一個問題,我想我有解決辦法,但是找不到人告訴我我是對還是錯? 請參見下面的C#示例:
public void Test(float number)
{
object myObj = number;
//Here is where I don't know what the correct way to do this is?
// int newNumber = (int)myObj;
// int newNumber = (int)(float)myObj;
// int newNumber = (int)(double)myObj;
}
結果必須確保不發生類型異常。 有什么主意嗎?
由於裝箱值的類型是float
,因此您需要先將其強制轉換為float
因為它需要取消裝箱:
int newNumber = (int)(float)myObj;
如果您懷疑重投的原因,可以從這些問題中找到更多信息:
讓我們嘗試一下...
//int newNumber = (int)myObj;
//InvalidCastException: Specified cast is not valid.
int newNumber = (int)(float)myObj; // works! newNumber is 2
//int newNumber = (int)(double)myObj;
//InvalidCastException: Specified cast is not valid.
當您擁有這樣一個帶框的數值並希望通過轉換將其轉換時,必須先將其轉換為確切的類型(在這種情況下為float
),然后再將其轉換為兼容的類型(在這種情況下為int
)。
如果您事先不知道它是float
,但您確實知道它可以轉換為int
,則應使用Convert.ToInt32
,無論myObj
是float
, double
還是其他類型,它都將起作用。
int newNumber = Convert.ToInt32(myObj);
根據您的測試,您不知道裝箱值的類型,那么我會避免進行任何重復轉換 (因為對於第一個值,您始終需要知道確切的類型 )。
有一個用於轉換的類,讓我們嘗試使用它:
int number = Convert.ToInt32(myObj, null);
實際上,這與普通鑄造完全不同,它將執行以下操作:
int number = ((IConvertible)myObj).ToInt32(null);
區別在於如何進行舍入 。 Cast將截斷您的數字(因此1.7將變為1),而轉換將進行舍入(因此1.7將變為2)。
如果您知道這是一個浮點數(但您不知道 double
或float
),那么我建議您先轉換為double
然后進行轉換:
int number = (int)Convert.ToDouble(myObj, null);
另請參閱我有關轉換和轉換之間差異的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.