Подтвердить что ты не робот

Почему Java BigDecimal возвращает 1E + 1?

Почему этот код иногда возвращает 1E + 1, а для других входов (например, 17) вывод не печатается в научной нотации?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
4b9b3361

Ответ 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