格式化一个double以省略不必要的".0"并且永远不会四舍五入

Jea*_*ett 9 java string-formatting

我知道如何格式化double以仅保留可用的小数位(DP),最多只能保留一定数量的DP.此示例最多可保留4个DP.

    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!
Run Code Online (Sandbox Code Playgroud)

现在我想要整数,例如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);
    }
Run Code Online (Sandbox Code Playgroud)

这两种方式看起来都非常笨拙.

Pet*_*rey 16

我使用以下内容

double d =
String s = (long) d == d ? "" + (long) d : "" + d; 
Run Code Online (Sandbox Code Playgroud)

如果你需要Double而不是double.(就我个人而言,我会避免使用包装器)

Double d =
String s = d.longValue() == d ? "" + d.longValue() : "" + d; 
Run Code Online (Sandbox Code Playgroud)

  • 即使编译器可以优化它,我相信使用String.valueOf(x)而不是""+ x是更好的风格 (2认同)
  • @peter:""+ d也会在内部调用String.valueOf().它将被转换为等效的"new StringBuilder().append("").append(String.valueOf(d)).toString()"创建更多的对象. (2认同)