Удалить конечные нули из двойного

Я хотел бы удалить все конечные нули без усечения или округления числа, если его нет. Например, число может быть чем-то вроде 12.0, и в этом случае нуль в конце следует удалить. Но число также может быть чем-то почти иррациональным, например, 12.9845927346958762... выходит за край экрана. Есть ли способ настроить DecimalFormat или какой-либо другой класс для вырезания конечных нулей, сохраняя при этом иррациональность?


person Mohit Deshpande    schedule 01.07.2012    source источник
comment
Двойник не может представлять иррациональное значение...   -  person Oliver Charlesworth    schedule 01.07.2012
comment
DecimalFormat с 0.### сделает такую ​​вещь. Конечно, double - это всего лишь приближение чисел с плавающей запятой. Возможно, используйте BigDecimal, но это также окончательный класс.   -  person Joop Eggen    schedule 01.07.2012
comment
@JoopEggen ноль перед запятой позволит использовать больше, чем разряд единиц, например, что-то вроде 234123412.1? Извините, я никогда раньше не использовал DecimalFormat.   -  person Mohit Deshpande    schedule 01.07.2012
comment
Да, и, кстати, DecimalFormat не изменяет исходное значение.   -  person Joop Eggen    schedule 01.07.2012
comment
Возможный дубликат stackoverflow .com/questions/703396/   -  person Vadzim    schedule 31.08.2012


Ответы (3)


Если вы хотите перейти на BigDecimal, есть #stripTrailingZeroes(), который выполняет это.

person Keppil    schedule 01.07.2012
comment
Влияет ли это на результирующее строковое представление? - person Jesse Rusak; 01.07.2012
comment
Но разве это не означает число 600,0 в научной записи? - person Mohit Deshpande; 01.07.2012
comment
@ Джесси Русак: Да. @Mohit: Нет, если вы используете #toPlainString() для вывода. - person Keppil; 01.07.2012

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

private static String removeTrailingZeros(double d) {
  return String.valueOf(d).replaceAll("[0]*$", "").replaceAll(".$", "");
}

System.out.println(removeTrailingZeros(1234.23432400000));
System.out.println(removeTrailingZeros(12.0));
person sperumal    schedule 01.07.2012
comment
Я думаю, что последняя замена должна быть больше похожа на: .replaceAll(\\.$, ); - person szymond; 01.08.2013

private static String removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll("[0]*$", "").replaceAll(".$", "");
}< бр>

or

private static String removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll(".?0*$", "");
}

Это неправильный код.

System.out.println(removeTrailingZeros(1234.23432400000));
вернуть: 1234.23432
но должен вернуть: 1234.234324


private static String removeTrailingZeros(double myDouble) {
return (new BigDecimal(Double.toString(myDouble))).toPlainString().replaceAll("[0]
*$", "").replaceAll(" .$", "");

Этот метод тоже работает неправильно

System.out.println(removeTrailingZeros(472.304000)); возвращает 472,30 вместо 472,304

System.out.println(removeTrailingZeros(472304000)); возвращает 47230 вместо 472304000


#stripTrailingZeroes() или toPlainString() для BigDecimal — хороший метод, но не единственный.

//----------------BigDecimal.toPlainString-------------
System.out.println( (новый BigDecimal(Double.toString(4724))).toPlainString());
System.out.println((new BigDecimal(Double.toString(472304000) ))).toPlainString());

возвращает:
4724.0 (это не нормально - мы не хотим '.0')
472304000 (это нормально)

//-------- --------BigDecimal.stripTrailingZeros-------------
System.out.println((new BigDecimal(Double.toString(4724< /strong>)).stripTrailingZeros()));
System.out.println((new BigDecimal(Double.toString(472304000d)).stripTrailingZeros()));
< br> возвращает:
4724.0 (это нормально)
4.72304E+8 (это не нормально — нам нужно 472304000 )

Идеальное разрешение текущей темы «Удалить завершающие нули из двойного» — использовать
.stripTrailingZeros().toPlainString()

Например:
//------ ---BigDecimal.stripTrailingZeros.toPlainString-----------------
System.out.println(new BigDecimal(Double.toString(472.304000< /strong>)).stripTrailingZeros().toPlainString());
System.out.println((new BigDecimal(Double.toString(4724)).stripTrailingZeros().toPlainString() ));
System.out.println((new BigDecimal(Double.toString(472304000d)).stripTrailingZeros().toPlainString()));

Результат:
472.304 (верно)
4724 (правильно)
472304000 (правильно)

person Armando    schedule 21.12.2012
comment
Отредактируйте блоки кода в соответствии с справочным документом. В большинстве случаев вам на самом деле не нужны теги HTML. - person bytebuster; 22.12.2012