簡體   English   中英

從浮點數獲取整數的正確方法是什么?

[英]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

由於裝箱值的類型是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 ,無論myObjfloatdouble還是其他類型,它都將起作用。

int newNumber = Convert.ToInt32(myObj);

根據您的測試,您不知道裝箱值的類型,那么我會避免進行任何重復轉換 (因為對於第一個值,您始終需要知道確切的類型 )。

有一個用於轉換的類,讓我們嘗試使用它:

int number = Convert.ToInt32(myObj, null);

實際上,這與普通鑄造完全不同,它將執行以下操作:

int number = ((IConvertible)myObj).ToInt32(null);

區別在於如何進行舍入 Cast將截斷您的數字(因此1.7將變為1),而轉換將進行舍入(因此1.7將變為2)。

如果您知道這是一個浮點數(但您不知道 doublefloat ),那么我建議您先轉換為double然后進行轉換:

int number = (int)Convert.ToDouble(myObj, null);

另請參閱我有關轉換和轉換之間差異的答案。

暫無
暫無

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

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