Отформатируйте 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 будут бесконечными в десятичном формате.
для двоичного представления вы можете просто использовать мантиссу и поставить десятичную точку в нужное положение (при необходимости, заполняя нули.