Отформатируйте double, чтобы опустить ненужное ".0 " и никогда не округлять [дубликат]

этот вопрос уже есть ответ здесь:

Я знаю, как отформатировать двойной, чтобы сохранить только доступные десятичные знаки (DP), до определенного количества DPs. Этот пример поддерживает до 4 DPs.

    double d = 1.0;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1"

    double d = 1.23;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1.23"

    double d = 1.2345678;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1.2346", rounding off: bad!

теперь я хочу целые числа, например 1.0 вернуться "1" без лишних .0 и # символ формата обеспечивает эту функциональность. Но как я могу убедиться, что число никогда не округляется? Есть ли другой способ, кроме произвольно длинной цепочки # например "#.###########################################"?

или я должен просто использовать преобразование по умолчанию double в string и усечь ".0" если он появляется в конец:

    String s = "" + d;
    if(s.substring(s.length()-2).equals(".0")) {
        s=s.substring(0, s.length()-2);
    }

оба пути кажутся ужасно неуклюжими.

3 ответов


Я использую следующие

double d =
String s = (long) d == d ? "" + (long) d : "" + d; 

Если вам нужен Double вместо double. (Лично я бы избегал использовать обертку, если вы можете)

Double d =
String s = d.longValue() == d ? "" + d.longValue() : "" + d; 

по умолчанию режим округления составляет DecimalFormat. Вы можете установить другой формат округления в соответствии с вашим requiremnet, используя setRoundingMode() метод

пример кода для установки режима округления

double d = 1.2345678;
        DecimalFormat df = new DecimalFormat("#.####");
        df.setRoundingMode(RoundingMode.DOWN);
        System.out.print(df.format(d));//result 1.2345 because of rounding down

вы можете использовать Double.doubleToLongBits () и извлечь экспоненту и мантиссу. Из api doc:

бит 63 (бит, выбранный маской 0x8000000000000000L) представляет знак числа с плавающей запятой. Биты 62-52 (биты выбор 0x7ff0000000000000L маска) представляют показатель. Биты 51-0 (биты, выбранные маской 0x000fffffffffffffL) представлять мантиссу (иногда называют мантисса) число с плавающей запятой.

показатель может использоваться для определения количества значимых цифр, но вам всегда придется округлять в какой-то момент, так как некоторые двоичные значения doulbe будут бесконечными в десятичном формате.

для двоичного представления вы можете просто использовать мантиссу и поставить десятичную точку в нужное положение (при необходимости, заполняя нули.