以下是关于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 (正确)
0.###
的 DecimalFormat 可以做到这一点。当然,double
只是浮点数的近似值。也许可以使用 BigDecimal,但它也是一个 final 类。 - Joop Eggen