Почему Java BigDecimal возвращает 1E + 1?
Почему этот код иногда возвращает 1E + 1, а для других входов (например, 17) вывод не печатается в научной нотации?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
Ответы
Ответ 1
использовать bigDecimal.toPlainString():
BigDecimal bigDecimal = BigDecimal.valueOf(100000.0)
.multiply(BigDecimal.valueOf(100d))
.stripTrailingZeros();
System.out.println("plain : " + bigDecimal.toPlainString());
System.out.println("scientific : " + bigDecimal.toEngineeringString());
выходы:
plain : 10000000
scientific : 10E+6
Ответ 2
Это неявное преобразование .toString()
, которое происходит, когда вы передаете результат в System.out.println()
.
Ответ 3
Точное обоснование поведения BigDecimal.toString()
объясняется в API doc в больших (и почти непонятных) деталях.
Чтобы получить согласованное (и языковое) текстовое представление, вы должны использовать DecimalFormat.
Ответ 4
Это в основном потому, что у вас недостаточно значимых цифр. Если вы умножаете то, что имеет только 1 значащую цифру со 100, тогда вы получаете что-то только с 1 значащей цифрой. Если он показывает "10", то в основном говорится, что он имеет 2 значащие цифры. Способ показать это имеет только 1 значащую цифру, чтобы показать "1 x 10 ^ 1".
Следующие два десятичных знака имеют одинаковое значение (10), но разные "шкалы" (где они начинают отсчет значительных цифр, верхний - 2 сиг-фига, нижний - 1):
System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1