2010-11-20 36 views
3

嘗試獲取float.MaxValue的整數部分,但它是拋出錯誤?Casting float.MaxValue to Long引發異常?

 long l = Convert.ToInt64(float.MaxValue); 
     Console.WriteLine(l); 

錯誤: 算術運算導致溢出。

+0

我只想要int32或int64中的float.MaxValue的整數部分。 – Lalit 2010-11-20 12:07:25

+1

感謝所有,只是好奇浮動可以如何更大,然後int32,都使用32位。 float:32位而int32:32bit – Lalit 2010-11-20 12:22:17

+0

請參閱我編輯的答案。 – 2010-11-20 12:26:08

回答

6

float的最大值是3.4E + 38,而long的最大值是9.2E + 18。因此,float.MaxValue將不適合long

Convert.ToInt64方法,當你指定的值大於Int64.MaxValue或小於Int64.MinValue

如果你只是想獲得的float.MaxValue的整數值,請參閱相關答案this question拋出OverflowException。但請注意,即使刪除了浮點數,float的最大值仍將不適合long數據類型。

編輯:一個float(一個32位的值)具有比long(64位值)更高的最大值的原因是,因爲浮點數在內部由計算機所表示的方式。浮點值類型可以容納比定點和整數類型更寬的值範圍,儘管這個更大的範圍是以犧牲精度爲代價來實現的。

0

MSDN about float conversion

Notice also that there is no implicit conversion from floating-point types to long.

+2

這並不重要,因爲他不想隱式施放它。這是MaxValues的問題。 – Femaref 2010-11-20 12:04:34

+0

但OP是使用顯式轉換,而不是隱式轉換... – BoltClock 2010-11-20 12:05:10

+0

o,是的,這是MaxValues的問題,而不是轉換。 – 2010-11-20 12:07:06

6

雖然float是一個較小的(4個字節)的結構比long(8字節)是,它有一個較寬的範圍。 (編輯:在回答「爲什麼」,你可能需要閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic不像大多數的積分類型,其範圍不等於2 ^位。)

float.MaxValue ~= 3.402823+e38 
long.MaxValue ~= 9.223372+e18 

顯然,float.MaxValue的組成部分,可以」 t表示爲long。 (不要緊,因爲要求這麼大的單精度浮點數的精度通常是完全沒有意義的)。

現在,你可以嘗試使用System.Numerics.BigInteger這裏(用appropriate constructor),如果你真的想與整型來表示這一點,但沒有進一步的信息我會認真懷疑你有真正需要這樣的大整數運算數字。

如果你需要的是顯示定點符號數,你可以使用相應的format-specifier

//output: "340282300000000000000000000000000000000" 
Console.WriteLine(float.MaxValue.ToString("F0")); 
+0

我只想int32或int64 float.MaxValue的整數部分 – Lalit 2010-11-20 12:08:40

+1

@Lalit:是的,但問題是'float.MaxValue'>'long.MaxValue'的整數部分,所以你不能適應它甚至如果你切斷了浮點。 – BoltClock 2010-11-20 12:09:59

+0

float:長32位:64位 – Lalit 2010-11-20 12:12:04

0

你可以使用的TryParse方法上的Int64。如果失敗,則只需使用浮點數的整數部分:

Int64.Parse(s.Substring(s.IndexOf(「。」)+ 1));

3

在.Net 4中有一個新的BigInteger類型可以處理這個數字的大小。