double
overflow a Infinity
e -Infinity
, non si avvolge. BigDecimal
non ha overflow, periodo, è limitato solo dalla quantità di memoria nel tuo computer. Vedere: How to get biggest BigDecimal value
L'unica differenza tra +
e .addExact
è che tenta di rilevare se si è verificato un overflow e genera un'eccezione invece di un wrapping. Ecco il codice sorgente:
public static int addExact(int x, int y) {
int r = x + y;
// HD 2-12 Overflow iff both arguments have the opposite sign of the result
if (((x^r) & (y^r)) < 0) {
throw new ArithmeticException("integer overflow");
}
return r;
}
Se si desidera verificare che si è verificato un overflow, in un certo senso è più semplice farlo con double
comunque, perché si può semplicemente verificare la presenza di Double.POSITIVE_INFINITY
o Double.NEGATIVE_INFINITY
; nel caso di int
e long
, è una questione un po 'più complicata perché non è sempre un valore fisso, ma in un altro, questi potrebbero essere input (ad esempio Infinity + 10 = Infinity
e probabilmente non si vuole lanciare un'eccezione in questo caso) .
Per tutti questi motivi (e non abbiamo ancora menzionato lo NaN
), questo è probabilmente il motivo per cui un tale metodo addExact
non esiste nel JDK. Naturalmente, è sempre possibile aggiungere la propria implementazione a una classe di utilità nella propria applicazione.
Nulla di precisione finita può, teoricamente, troppopieno. –
Il supporto di addExact for double è molto più difficile in quanto è una rappresentazione approssimativa in primo luogo.Non è nemmeno possibile aggiungere 0,1 e 0,2 esattamente. L'overflow per BigDecimal è così grande che è probabile che si esaurisca prima la memoria. –
Se con il doppio si va troppo lontano da non poter più essere rappresentato si ottiene un valore 'Infinity'. Quello sarebbe un trabocco. –