从双精度数中去除小数点后的零

7
我正在尝试动态地在字符串中显示数字,如果数字有小数,则显示小数点后的数字,如果没有,则不显示 .0。
例如:将 5.5 显示为 5.5,将 5.0 显示为 5。
目前我的代码如下:(答案是一个双精度浮点数)
double temp = answer;
long temp2 = (long) temp;
if (temp == temp2) {
output = String.valueOf(temp2);
System.out.println(output);

这段代码在1e18以内的数值范围内工作正常,但是当处理超过Long类型最大值时会出错。 那么如何处理像5.43e86这样更大的数字呢?


1
为什么不使用 DecimalFormat? - Raveline
可能是如何将浮点类型格式化为字符串?的重复问题。 - rds
@EJP Math.floor() 也返回一个 double,所以 .0 会保留。 - zfj3ub94rf576hc4eegm
5个回答

27

使用DecimalFormat

double answer = 5.0;
DecimalFormat df = new DecimalFormat("###.#");
System.out.println(df.format(answer));

1
我认为你的意思是 new DecimalFormat("###");,因为他不想看到小数点后面的数字。 - AlexR
1
谢谢!我在我的应用程序中其他地方使用了devimalformat。本来应该想到的。非常好的答案。 - Josh
@AlexR -- 如果answer = 5.5,那么它将打印5(而不是5.0)和5.5。 - Kal
-1,#表示“数字,零表示缺席”,它仍然会在小数后面打印出0。这不是他要求的。 - GBa
@Greg -- 我建议你尝试上面的代码。它完全符合OP的要求。 - Kal

2

使用new DecimalFormat("0.#")不是一个好的解决方案,因为你会丢失数据,例如PI = 3.14,但在解析后你得到的是3.1

另一个解决方案是使用eval%1 ? (int)d : d,但这会导致整数上限问题,同样会丢失数据

我的解决方案可以工作,但这不是一个好主意

res = removeLastChars(eval,".0");

private String removeLastChars(double eval, String text){

    String res = String.valueOf(eval);
    int length = text.length();

    if (res.length() > length){
        res = res.substring((res.length() - length), res.length()).equals(text)
                ? res.substring(0, (res.length() - length)) : res;
    }

    return res;
}

2
DecimalFormat建议是处理这个问题最简单的方式。如果它们不够用,这里有另一个想法。
如果你开始达到Java原语可以表示的最大值,那么你可能需要转向BigInteger和BigDecimal。
尝试使用BigDecimal的toBigInteger()方法以及BigDecimal和BigInteger的toString()方法进行实验。

0
使用Apache commons-lang:
StringUtils.removeEnd(String.valueOf(100d), ".0")

返回的是"100"而不是"100.0":

import org.apache.commons.lang3.StringUtils;

System.out.println(String.valueOf(100d)); // output is "100.0"
System.out.println(StringUtils.removeEnd(String.valueOf(100d), ".0")); // output is "100"

-3

这将使用德国语言环境(Java版本1.6.0_24-b07)打印“5.0”或“5,0”。 - user85421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接