Это не имеет ничего общего с особенностью Java.Это связано с ограниченной точностью 64-битных двойных чисел IEEE.На самом деле все типы данных имеют пределы своей точности.SO больше, чем другие.
double d = 123456789012345.99;
System.out.println(d);
отпечатки
1.2345678901234598E14
Если вы хотите большей точности, используйте BigDecimal.
BigDecimal bd = new BigDecimal("123456789012345.99");
System.out.println(bd);
печать
123456789012345.99
Даже у BigDecimal тоже есть ограничения, но они намного превосходят то, что вам или кому-либо еще нужно.(~ 2 миллиарда цифр)
РЕДАКТИРОВАТЬ: Самые большие известные простые числа вписываются в BigDecimal http://primes.utm.edu/largest.html