Печать BigDecimal [дубликат]

Иногда использование события error не представляется возможным, например. потому что вы пытаетесь сделать что-то на уже загруженной странице, например, когда вы запускаете код через консоль, букмарклет или скрипт, загружаемый асинхронно. В этом случае проверка img.naturalWidth и img.naturalHeight равна 0.

Например, здесь приведен фрагмент для перезагрузки всех сломанных изображений с консоли:

$$("img").forEach(img => {
  if (!img.naturalWidth && !img.naturalHeight) {
    img.src = img.src;
  }
}
4
задан keyser 2 August 2013 в 23:33
поделиться

4 ответа

Вы можете использовать DecimalFormat с setMinimumFractionDigits(int scale):

private static String format(BigDecimal x, int scale) {
  NumberFormat formatter = new DecimalFormat("0.0E0");
  formatter.setRoundingMode(RoundingMode.HALF_UP);
  formatter.setMinimumFractionDigits(scale);
  return formatter.format(x);
}
...
System.out.println(format(new BigDecimal("0.00001"), 2)); // 1.00E-5
System.out.println(format(new BigDecimal("0.00001"), 3)); // 1.000E-5
3
ответ дан DannyMo 19 August 2018 в 14:50
поделиться
  • 1
    Но что, если значение шкалы изменится? Как я могу справиться с этим? – Luso 2 August 2013 в 23:52
  • 2
    @Luso увидеть обновленный ответ – DannyMo 3 August 2013 в 00:01
  • 3
    Ниже приведена версия, которая автоматически устанавливает масштаб. – Steve Waring 17 September 2014 в 23:37
  • 4
    Примечание. DecimalFormat обрабатывает только числа, которые могут быть выражены как парные. Попробуйте форматировать BigDecimal («1e400»), он дает вам «∞». – Eddie Carlson 12 August 2016 в 00:00

Вы можете использовать что-то вроде этого:

int maxScale = 2;

BigDecimal value = BigDecimal.ONE;
BigDecimal x = new BigDecimal("0.00001");
BigDecimal result = value.multiply(x);

if (result.scale() > maxScale) {
    System.out.format("result: %.2E\n", result); // You can change .2 to the value you need
} else {
    System.out.println("result: " + result.toPlainString());
}
0
ответ дан AleX 19 August 2018 в 14:50
поделиться

Попробуйте класс DecimalFormat. Он имеет методы форматирования для методов для двойных и длинных чисел, поэтому вы должны сделать что-то вроде этого:

BigDecimal x = new BigDecimal("0.00001");
DecimalFormat frmt = new DecimalFormat("0.00E00");
String formatted = frmt.format(x.doubleValue());
System.out.println("result: " + formatted);

DecimalFormat javadoc

0
ответ дан Dan Seibert 19 August 2018 в 14:50
поделиться
  • 1
    Перемещение большого десятичного знака в double может испортить значение. Это не решение. – Steve Waring 4 September 2014 в 22:46

Вот вариант ответа DannyMo, который автоматически устанавливает масштаб:

private static String format(BigDecimal x)
{
    NumberFormat formatter = new DecimalFormat("0.0E0");
    formatter.setRoundingMode(RoundingMode.HALF_UP);
    formatter.setMinimumFractionDigits((x.scale() > 0) ? x.precision() : x.scale());
    return formatter.format(x);
}

System.out.println(format(new BigDecimal("0.01")));   // 1.0E-2
System.out.println(format(new BigDecimal("0.001")));  // 1.0E-3
System.out.println(format(new BigDecimal("500")));    // 5E2
System.out.println(format(new BigDecimal("500.05"))); // 5.00050E2
7
ответ дан Steve Waring 19 August 2018 в 14:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: