Java 如何抑制自动加后缀“quot;。0“;当串化双精度矩阵时,对于积分情形?

Java 如何抑制自动加后缀“quot;。0“;当串化双精度矩阵时,对于积分情形?,java,Java,考虑 Double f = 2.0; String s = f.toString(); 结果字符串s为“2.0”。如何设置f的格式,使f没有小数部分的情况下的答案不附加.0?(对于f有小数部分的情况,我需要将其包括在内。)。是的,出于某种原因,Double上的toString()方法在Double为整数的情况下追加了.0 一个令人讨厌的黑客会 f % 1.0 == 0.0 ? new Integer(f.intValue()).toString() : f.toString(); 但对我来说

考虑

Double f = 2.0;
String s = f.toString();
结果字符串
s
为“2.0”。如何设置
f
的格式,使
f
没有小数部分的情况下的答案不附加
.0
?(对于
f
有小数部分的情况,我需要将其包括在内。)。是的,出于某种原因,
Double
上的
toString()
方法在
Double
为整数的情况下追加了
.0

一个令人讨厌的黑客会

f % 1.0 == 0.0 ? new Integer(f.intValue()).toString() : f.toString();

但对我来说,这看起来很糟糕。

您可以使用几个类的几个帮助方法来实现相同的结果:

    Double f = 2.0;
    String s = null;
    // option1: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-int-
    s = String.valueOf(f.intValue());
    System.out.println(s);
    // option2: https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#toString-int-
    s = Integer.toString(f.intValue());
    System.out.println(s);
    // option3: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...-
    s = String.format("%.0f", f);
    System.out.println(s);
    // option4: https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html#DecimalFormat-java.lang.String-
    s = new DecimalFormat("#").format(f);
    System.out.println(s);
对于输入,例如:

Double f = 21231.232222323;
输出将是:21231

使用数字格式(用于更高级的格式)


似乎没有一个微不足道的格式化程序可以做到这一点。使用(感谢@Thomas简化了整型案例)

这似乎是最好的办法


f%1.0
是在Java中测试积分
f
的好方法。

如果我正确理解了您的问题,您可以尝试以下方法:

    double f = 2.0;
    int i = (int)f;
    if (i==f){
        String s = String.valueOf(new DecimalFormat("#").format(f));
        System.out.println(s);
    }
    else{
        String s = String.valueOf(new DecimalFormat("#.###").format(f)); // for example
        System.out.println(s);
    }
}

//now if the number after the point is fully zero, it will not take it
结果

f=2.0 -> s=2
f=2.005 -> s=2.005
编辑:在几行中,如果十进制后没有特定的“位数”->您可以像这样使用三元运算符

double f = 2.000;
int i = (int)f;
String s = (f==i)? String.valueOf(i): String.valueOf(f);
System.out.println(s);

按照注释中的建议,尝试
DecimalFormat

static void show(double v){
    DecimalFormat format = new DecimalFormat("##########.##");
    System.out.println(format.format(v));
}
public static void main (String[] args) throws java.lang.Exception
{
    show(1.1);
    show(1.0);
    show(1.15);
    show(1.116);
}
结果将是:

1.1

一,

1.15

1.12


这似乎是您正在寻找的格式。

使用
十进制格式
获取任何您喜欢的格式。顺便说一句,
新整数(f.intValue()).toString()
->
字符串.valueOf(f.intValue())
“+f.intValue()
@Thomas:如果你这样写的话,三元结构看起来并没有那么糟糕。可能的三元结构的副本不是真的。这个复制是关于插入小数点和千位分隔符。我的是关于抑制不必要的。0这会保留2.1和666.6之类的小数部分吗?你是对的,我修正了答案。数字格式不应在不需要时打印不必要的小数。这会将123.456截断为123.45吗?会的,您可以跳过设置最大小数位数。它是用来演示格式化选项的。是的,单独处理整型案例似乎是唯一的方法。现在这太棒了。我更喜欢三元结构的对称性,而不是我的对称性。我真的不喜欢使用
toString()
。非常感谢。我很高兴能帮上忙,但它们似乎会截断小数点,如2.1或123.456。你的意思是哪个选项?好的
f.intVal
肯定会删除小数部分。我的理解是“%.0f”也会这样做,依此类推。否。1.116必须是1.116。你有最多的名额吗?只需添加更多的
#
s。
double f = 2.000;
int i = (int)f;
String s = (f==i)? String.valueOf(i): String.valueOf(f);
System.out.println(s);
static void show(double v){
    DecimalFormat format = new DecimalFormat("##########.##");
    System.out.println(format.format(v));
}
public static void main (String[] args) throws java.lang.Exception
{
    show(1.1);
    show(1.0);
    show(1.15);
    show(1.116);
}