从双精度浮点数中移除尾部零

10
我想移除所有末尾的零,但同时不截断或四舍五入数字,如果数字末尾没有任何零,则保留原样。例如,数字可能是类似于12.0这样的东西,在这种情况下,应该移除末尾的零。但数字也可能是类似于12.9845927346958762...这样的近似无理数,一直延伸到屏幕边缘。是否有一种方式可以设置DecimalFormat或其他类来去掉尾随零,同时保持无理数的不规则性?

3
一个双精度浮点数无法表示一个无理数的值... - Oliver Charlesworth
2
一个带有 0.### 的 DecimalFormat 可以做到这一点。当然,double 只是浮点数的近似值。也许可以使用 BigDecimal,但它也是一个 final 类。 - Joop Eggen
@JoopEggen 零点前的数字可以允许超过个位数,例如像234123412.1这样的数字吗? 很抱歉,我以前从未使用过DecimalFormat。 - Mohit Deshpande
是的,顺便提一下,DecimalFormat 不会修改原始值。 - Joop Eggen
可能是 https://dev59.com/sHRB5IYBdhLWcg3wJkhC 的重复问题。 - Vadzim
4个回答

26

这会影响最终的字符串表示吗? - Jesse Rusak
3
那么这是否会把像 600.0 这样的数字用科学计数法表示? - Mohit Deshpande
6
@Jesse Rusak: 是的。 @Mohit: 如果你使用#toPlainString()输出,则不会出现这种情况。 - Keppil

6
以下是关于IT技术的翻译:

private static String removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll("[0]*$", "").replaceAll(".$", "");
}

或者

private static String removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll(".?0*$", "");
}

这些都是错误的代码。

System.out.println(removeTrailingZeros(1234.23432400000));
返回:1234.23432
但实际上应该返回:1234.234324


private static String removeTrailingZeros(double myDouble) {
return (new BigDecimal(Double.toString(myDouble))).toPlainString().replaceAll("[0]
*$", "").replaceAll(".$", "");
}

这个方法也有问题。

System.out.println(removeTrailingZeros(472.304000)); 返回472.30,而不是472.304

System.out.println(removeTrailingZeros(472304000)); 返回47230,而不是472304000

BigDecimal的 #stripTrailingZeroes() 或 toPlainString() 方法都很好,但是单独使用并不行。 //----------------BigDecimal.toPlainString-------------
System.out.println((new BigDecimal(Double.toString(4724))).toPlainString());
System.out.println((new BigDecimal(Double.toString(472304000))).toPlainString());
返回:
4724.0(这不好,我们不想要 '.0')
472304000(这是好的)
//----------------BigDecimal.stripTrailingZeros-------------
System.out.println((new BigDecimal(Double.toString(4724)).stripTrailingZeros()));
System.out.println((new BigDecimal(Double.toString(472304000d)).stripTrailingZeros()));
返回:
4724.0(这是好的)
4.72304E+8(这不好,我们想要 472304000
当前主题“从double中删除尾随零”的完美解决方案是使用.stripTrailingZeros().toPlainString()。
例如:
//---------BigDecimal.stripTrailingZeros.toPlainString-----------------
System.out.println(new BigDecimal(Double.toString(472.304000)).stripTrailingZeros().toPlainString());
System.out.println((new BigDecimal(Double.toString(4724)).stripTrailingZeros().toPlainString()));
System.out.println((new BigDecimal(Double.toString(472304000d)).stripTrailingZeros().toPlainString()));
结果为:
472.304 (正确)
4724 (正确)
472304000 (正确)

1
请根据帮助文档编辑代码块。在大多数情况下,您实际上不需要HTML标签。 - Be Brave Be Like Ukraine

6
您可以使用字符串操作来删除尾部的零。
private static String removeTrailingZeros(double d) {
  return String.valueOf(d).replaceAll("[0]*$", "").replaceAll(".$", "");
}

System.out.println(removeTrailingZeros(1234.23432400000));
System.out.println(removeTrailingZeros(12.0));

7
我认为最后一个“replace”应该改成: .replaceAll("\.$", ""); 它的意思是删除字符串末尾的句号。 - szymond

-3
double result = ...;
int intResult = (int)result;
if (result == intResult) {
    System.out.println(intResult);
} else {
    System.out.println(result);
}

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