Estou com problemas para formatar números muito grandes.
Abaixo segue o código para formatação do número 999999999999999999.994, que formatado fica 1.000.000.000.000.000.000,00.
BigDecimal valor = new BigDecimal("999999999999999999.994");
DecimalFormat fD = new DecimalFormat("###,##0.00");
DecimalFormatSymbols sD = new DecimalFormatSymbols();
sD.setDecimalSeparator(',');
fD.setDecimalFormatSymbols(sD);
System.out.println(fD.format(valor));
Pergunta: você quer que seja formatado como "1.000.000.000.000.000.000,00" ou como "999.999.999.999.999.999,99"?
Pelo que aprendi na escola, o tal número que você mostrou (999999999999999999.994), ao ser formatado para 2 casas depois da vírgula, deve mostrar mesmo "999.999.999.999.999.999,99", e seu código está correto. (Se fosse o número 999999999999999999.996 aí o arredondamento seria para "1.000.000.000.000.000.000,00".
No caso …995, onde o número termina com 5, aí vai ser usado o modo ROUND_HALF_EVEN, também conhecido como “Bankers’ rounding”: ele arredonda para cima se o valor resultante do arredondamento para cima for par, e para baixo se o valor resultante do arredondamento para cima for ímpar. Exemplo:
.995 -> .00 porque o resultante é 0.
.985 -> .98 porque se fosse arredondar para cima ia dar .99, que é ímpar.
Era para aparecer “999,999,999,999,999,999,99” ou “1.000.000.000.000.000.000,00”? Se for o primeiro, aqui deu certo, se for o segundo, podes usar um outro MathContext e ajustar precisão e arredondamento. Como faz isso? Veja no Javadoc do BigDecimal e do MathContext.