2011-09-22 6 views

risposta

43

È perché la gamma di un double (± 5,0 × 10 -324 a ± 1,7 × 10) è molto maggiore del campo di un int (-2.147.483.648 su 2.147.483.647). Se il tipo di reso fosse int, molti possibili input non sarebbero riusciti. Ad esempio, Math.Ceiling potrebbe essere costretto a lanciare un OverflowException in un contesto checked oppure potrebbe persino restituire un risultato errato in un contesto non controllato. Questo è un comportamento indesiderato.

Anche alcuni valori speciali come NaN e PositiveInfinity possono essere restituiti con questo metodo. Questo è possibile solo se il tipo di reso è double.

Se credi che il risultato si inserisce in un int, è possibile aggiungere un cast esplicito:

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

E, naturalmente, se si fa un cast esplicito come quello ad esempio, se il valore * non lo fa * In forma, il runtime genererà un adattamento (e avrai l'eccezione da trattare). –

+0

È davvero sciocco: i duplicati possono comunque solo memorizzare ~ 7-8 cifre significative in modo affidabile, quindi non sarà possibile arrotondare qualcosa di più elevato di '2147483648'. –

+1

@ ChrisBurt-Brown: Un 'double' può contenere ogni multiplo da mezzo a 2^52, che è considerevolmente più grande dell'intervallo 2^31 di' Int32' (ma inferiore all'intervallo 2^63 di un ' Int64'). – supercat

Problemi correlati