2011-09-22 10 views

Odpowiedz

43

To dlatego, że zasięg double (± 5,0 x 10 -324 ± 1,7 x 10) jest znacznie większa niż w zakresie int (-2,147,483,648 do 2,147,483,647). Jeśli zwracany typ byłby int, wiele możliwych danych wejściowych zakończyłoby się niepowodzeniem. Na przykład Math.Ceiling może zostać zmuszony do podania wartości OverflowException w kontekście checked lub może nawet zwrócić nieprawidłowy wynik w niezaznaczonym kontekście. Jest to niepożądane zachowanie.

Również niektóre specjalne wartości, takie jak NaN i PositiveInfinity, mogą zostać zwrócone tą metodą. Jest to możliwe tylko wtedy, gdy typem zwrotu jest double.

Jeśli uważasz, że wynik będzie pasować do int, można dodać wyraźnie Obsada:

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

I oczywiście, jeśli nie wyraźny obsady jak ten przykład, jeśli wartość nie * * Dopasuj, środowisko wykonawcze rzuci dopasowanie (a otrzymasz wyjątek do rozwiązania). –

+0

To naprawdę głupie: gra podwójna może w niezawodny sposób przechowywać ~ 7-8 znaczących figur, więc nie będziesz w stanie rundować niczego wyżej niż '2147483648'. –

+1

@ ChrisBurt-Brown: "Podwójny" może pomieścić każdą wielokrotność połowy do 2^52, która jest znacznie większa niż zakres 2^31 "Int32" (ale mniejszy niż zakres 2^63) Int64'). – supercat

Powiązane problemy