Как уже упоминалось, вы должны использовать java.math.BigDecimal вместо float / double.Это, однако, имеет свой собственный набор проблем.
Например, когда вы вызываете BigDecimal (double), значение, которое вы передаете, будет расширено до его полного представления:
BigDecimal oneTenth = new BigDecimal(0.1);
BigDecimal oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0000000000055511151231257827021181583404541015625000000
Но когда выиспользуйте конструктор BigDecimal (String), где будет представлено действующее значение, и вы получите
BigDecimal oneTenth = new BigDecimal("0.1");
BigDecimalr oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0
Подробнее об ограничениях BigDecimal вы можете прочитать в великолепной книге Джошуа Блоха и Нила Гафтера Java-головоломки и в это информативная статья.Наконец, обратите внимание, что toString в BigDecimal будет печататься в научной нотации, поэтому вместо этого вам придется правильно использовать toPlainString .