Если вы используете DecimalFormat
для преобразования double
в String
, это очень просто:
DecimalFormat formatter = new DecimalFormat("0.0##");
formatter.setRoundingMode(RoundingMode.HALF_UP);
double num = 1.234567;
return formatter.format(num);
Есть несколько значений RoundingMode
для выбора, в зависимости от поведения Вы требуете.
Загрузка является операцией во время выполнения. Все загружается во время выполнения.
Компилятор оптимизирует встроенные поля static final , встраивая значение в байт-код вместо вычисления значения во время выполнения.
Когда вы запускаете JVM и загружаете класс в первый раз (это делается загрузчиком классов, когда на класс впервые ссылаются каким-либо образом), любые статические блоки или поля «загружаются» в JVM и стать доступным.
Демонстрация:
public class StaticDemo {
// a static initialization block, executed once when the class is loaded
static {
System.out.println("Class StaticDemo loading...");
}
// a constant
static final long ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;
// a static field
static int instanceCounter;
// a second static initialization block
// static members are processed in the order they appear in the class
static {
// we can now acces the static fields initialized above
System.out.println("ONE_DAY_IN_MILLIS=" + ONE_DAY_IN_MILLIS
+ " instanceCounter=" + instanceCounter);
}
// an instance initialization block
// instance blocks are executed each time a class instance is created,
// after the parent constructor, but before any own constructors (as remarked by Ahmed Hegazy)
{
StaticDemo.instanceCounter++;
System.out.println("instanceCounter=" + instanceCounter);
}
public static void main(String[] args) {
System.out.println("Starting StaticDemo");
new StaticDemo();
new StaticDemo();
new StaticDemo();
}
static {
System.out.println("Class StaticDemo loaded");
}
}
Вывод:
Class StaticDemo loading...
ONE_DAY_IN_MILLIS=86400000 instanceCounter=0
Class StaticDemo loaded
Starting StaticDemo
instanceCounter=1
instanceCounter=2
instanceCounter=3
Обратите внимание, что «Запуск StaticDemo» не отображается в качестве первой строки вывода. Это связано с тем, что класс должен быть загружен до , и основной метод может быть выполнен, что означает, что все статические поля и блоки обрабатываются по порядку.
Статические поля загружаются при загрузке класса. Обычно это происходит при создании файлового объекта класса, но это может произойти раньше, если класс используется другим способом.
Статический инициализатор является поточно-ориентированным, и вы можете безопасно обращаться к классу в нескольких потоках. Это полезно как способ создания синглтона, безопасного для многопоточного режима, без использования блокировки.
Примечание: класс может быть загружен (и его блок статической инициализации запущен) более одного раза, если используется несколько загрузчиков классов. Как правило, загрузка одного и того же класса в нескольких загрузчиках классов может сбивать с толку и избегать этого, но это поддерживается и работает.