2011-09-22 3 views
20

可能性の重複:このメソッドを定義
なぜmath.Ceiling(double a)がintを直接返さないのですか?

Why doesn't Math.Round/Floor/Ceiling return long or int?

MSDN:指定された倍精度浮動小数点数よりも大きいかまたは等しい最小の整数を返します。

が、実際には、それが直接int型返さない理由

public static double Ceiling (
    double a 
) 

のですか?マイクロソフトは何を考えていますか?

答えて

43

(1.7×10 を±×10 -324 5.0±)doubleの範囲は、int(2,147,483,647に-2147483648)の範囲よりもはるかに大きいので、それはです。戻り値の型がintの場合、多くの入力が失敗します。たとえば、Math.Ceilingは、checkedコンテキストにOverflowExceptionを強制的にスローしたり、チェックされていないコンテキストで間違った結果を返すことさえあります。これは望ましくない動作です。

NaNPositiveInfinityなどの特殊な値もこのメソッドで返すことができます。これは戻り値の型がdoubleの場合にのみ可能です。

あなたは結果がintに収まると思われる場合は、明示的なキャストを追加することができます値は*ない場合は、その例のように、明示的なキャストを行う場合、

int result = (int)Math.Ceiling(a); 
+0

そしてもちろんを*適合すると、ランタイムは適合をスローします(そして処理する例外があります)。 –

+0

それは本当に愚かです。倍精度は、とにかく〜7-8の有効数字だけを確実に保存することができるので、2147483648より高い何かを丸めることはできません。 –

+1

@ ChrisBurt-Brown: 'double'は1/2の倍数を2^52まで保持できます。これは' Int32'の2^31の範囲よりかなり大きいですが( ' Int64')。 – supercat

関連する問題