2010-11-20 15 views
3

float.MaxValueの整数部分を取得しようとしましたが、エラーをスローしていますか?float.MaxValueをlongにキャストすると例外がスローされますか?

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

エラー: 算術演算でオーバーフローが発生しました。

+0

float.MaxValueの整数部分をint32またはint64のいずれかにしたいだけです。 – Lalit

+1

ありがとう、ちょうど浮動小数点がint32より大きくなる可能性があることに興味があり、どちらも32ビットを使用します。 float:32ビットwhile int32:32bit – Lalit

+0

私の編集した答えを見てください。 –

答えて

6

floatの最大値は3.4E + 38であり、longの最大値は9.2E + 18です。したがって、float.MaxValuelongに収まりません。あなただけfloat.MaxValueの整数値を取得したい場合は

Convert.ToInt64方法はOverflowExceptionをスローあなたはInt64.MaxValue以上Int64.MinValue

未満の値を指定した場合、this questionに関連の回答を参照してください。しかし、浮動小数点を削除しても、floatの最大値は、longのデータ型にはまだ適合しません。

EDIT: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

+0

しかし、OPは暗黙の変換ではなく明示的な変換を使用しています... – BoltClock

+0

oはい、変換にではなく、MaxValuesに問題があります。 –

6

floatlong(8バイト)よりも小さく(4バイト)の構造であるが、それは広い範囲を持っている、です。 (EDIT:。。「なぜ」に対応して、あなたが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と表されます。 (このような大きな単精度浮動小数点数を持つこのような精度を求めることは、通常は全く意味がないという事実を気にしないでください)。

さて、あなたは本当に整数型でこれを表現したい場合は、(appropriate constructorで)ここにSystem.Numerics.BigIntegerを使用して試みることができるが、それ以上の情報がないと私はあなたがこのような大規模なと整数演算のための本当必要性を持って真剣に疑うだろう数字。

あなたが必要とするすべての表示にある場合は、固定小数点表記の数値は、適切なformat-specifierを使用することができます。

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

float.MaxValueの整数部分をint32またはint64のいずれかにしたいとします。 – Lalit

+1

@Lalit:問題は、float.MaxValue'> 'long.MaxValue'の整数部分であり、それでも問題にならないようにすることですあなたが浮動小数点を切り捨てるならば。 – BoltClock

+0

float:32 bit while long:64ビット – Lalit

0

あなたはInt64型のTryParseメソッドを使用することができます。それが失敗した場合は、単に使用してフロートの不可欠な部分を取る:

Int64.Parse(s.Substring(s.IndexOf()+ 1) "");

3

は、.NET 4には数の大きさを扱うことができる新しいBigIntegerタイプがあります。

関連する問題