Не проверяете переполнение. Не надо использовать long или BigInteger, просто проверьте переполнение.