Java 8 gave us Math.addExact() for integers but not decimals.
Is it possible for double
and BigDecimal
to overflow? Judging by Double.MAX_VALUE and How to get biggest BigDecimal value I'd say the answer is yes.
As such, why don't we have Math.addExact()
for those types as well? What's the most maintainable way to check this ourselves?
double
overflows to Infinity
and -Infinity
, it doesn't wrap around. BigDecimal
doesn't overflow, period, it is only limited by the amount of memory in your computer. See: How to get biggest BigDecimal value
The only difference between +
and .addExact
is that it attempts to detect if overflow has occurred and throws an Exception instead of wraps. Here's the source code:
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;
}
If you want to check that an overflow has occurred, in one sense it's simpler to do it with double
anyway because you can simply check for Double.POSITIVE_INFINITY
or Double.NEGATIVE_INFINITY
; in the case of int
and long
, it's a slightly more complicated matter because it isn't always one fixed value, but in another, these could be inputs (e.g. Infinity + 10 = Infinity
and you probably don't want to throw an exception in this case).
For all these reasons (and we haven't even mentioned NaN
yet), this is probably why such an addExact
method doesn't exist in the JDK. Of course, you can always add your own implementation to a utility class in your own application.