Как сделать формат Java двойным, как -3.2, а не -3.1999999999999953? - PullRequest
8 голосов
/ 15 декабря 2011

Мое приложение создает double, где Double.toString () создает "-3.1999999999999953", тогда как я ожидаю, что оно выдаст "-3.2".

Я на самом деле получаю эти удвоения от JScience's Amount#getEstimatedValue().

Я не хочу устанавливать произвольное количество цифр для точности, так как я не знаю, сколько цифр будет значительным, но я не хочу, чтобы он производил числа, заканчивающиеся на "99999999. *".

Как я могу без проблем конвертировать Doubles в Strings?

Ответы [ 3 ]

7 голосов
/ 15 декабря 2011

Рекомендуемое решение

BigDecimal.valueOf (hisDouble).toPlainString ()

Взлом, предоставленный позже в последнем разделе этого поста, был первым, что пришло в голову при попытке решить вопрос ОП.

Тогда мой друг спросил, что я делаю, и сказал, что OP лучше использовать BigDecimal, и я перешел в режим facepalm ..

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


При печати вы можете использовать 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
4 голосов
/ 15 декабря 2011

Использование BigDecimal:

System.out.println(BigDecimal.valueOf(-3.2d).toPlainString());

Вывод:

-3.2
3 голосов
/ 15 декабря 2011

Вы можете попробовать

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

Слегка "тяжеловес", но стоит сделать свое дело.Некоторые примеры использования по адресу:

Граница подшаблона DecimalFormat не работает правильно

...