如何使Java格式像-3.2而不是-3.1999999999999953?

时间:2011-12-15 17:20:26

标签: java jscience

我的应用程序正在生成Double.toString()生成“-3.1999999999999953”的双打 - 而我希望它生成“-3.2”。

我实际上从JScience的Amount#getEstimatedValue()获得了这些双打。

我不想为精度设置任意数字的位数,因为我不知道有多少位数是重要的,但我不希望它产生以“99999999. *”结尾的数字。

如何在没有此问题的情况下将双打转换为字符串?

3 个答案:

答案 0 :(得分:7)

推荐的解决方案

BigDecimal.valueOf (hisDouble).toPlainString ()

本文最后一部分后面提供的黑客攻击是在尝试解决OP问题时首先想到的。

然后一位朋友问我在做什么,并说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

答案 1 :(得分:4)

使用BigDecimal

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

输出:

-3.2

答案 2 :(得分:3)

你可以尝试

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

稍微“重量级”,但应该做的伎俩。一些示例用法:

DecimalFormat subpattern boundary not working right