Как сделать формат Java двойным, как -3.2, а не -3.1999999999999953?
Мое приложение производит double, где Double.toString() производит "-3.1999999999999953", тогда как я ожидаю, что оно выдаст "-3.2".
Я на самом деле получаю эти двойники от JScience's Amount#getEstimatedValue()
,
Я не хочу устанавливать произвольное количество цифр для точности, так как я не знаю, сколько цифр будет значительным, но я не хочу, чтобы он производил числа, заканчивающиеся на "99999999.*".
Как я могу конвертировать Doubles в Strings без этой проблемы?
3 ответа
Рекомендуемое решение
BigDecimal.valueOf (hisDouble).toPlainString ()
Взлом, предоставленный позже в последнем разделе этого поста, был первым, что пришло в голову при попытке решить вопрос ОП.
Тогда друг спросил, что я делаю, и сказал, что OP лучше использовать BigDecimal
и я вошел в режим лицевой стороны..
Но я оставлю этот взлом в этом посте, чтобы мир мог видеть, насколько глупым я могу быть иногда.
При печати вы можете использовать System.out.format
,
Фрагмент ниже будет округлять значение yourDecimal
до одного десятичного знака, а затем выведите значение.
Double yourDouble = -3.1999999999999953;
System.out.format ("%.1f", yourDouble);
выход
-3.2
Самый глупый взлом, когда-либо написанный
public static String fixDecimal (Double d) {
String str = "" + d;
int nDot = str.indexOf ('.');
if (nDot == -1)
return str;
for (int i = nDot, j=0, last ='?'; i < str.length (); ++i) {
j = str.charAt (i) == last ? j+1 : 0;
if (j > 3)
return String.format ("%."+(i-nDot-j-1)+"f", d);
last = str.charAt (i);
}
return str;
}
...
Double[] testcases = {
3.19999999999953,
3.145963219488888,
10.4511111112,
100000.0
};
for (int i =0; i < testcases.length; ++i)
System.out.println (
fixDecimal (testcases[i]) + "\n"
);
выход
3.2
3.1459632195
10.45
100000.0
Использование BigDecimal
:
System.out.println(BigDecimal.valueOf(-3.2d).toPlainString());
Выход:
-3.2
Вы могли бы попробовать
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html
Слегка "тяжеловес", но должен сделать свое дело. Некоторые примеры использования по адресу: