【问题标题】:Remove trailing zeros from double从 double 中删除尾随零
【发布时间】:2012-07-02 08:26:32
【问题描述】:

如果没有任何数字,我想删除所有尾随零而不截断或舍入数字。例如,数字可能类似于12.0,在这种情况下,应删除尾随零。但这个数字也可能是几乎不合理的,例如 12.9845927346958762... 出现在屏幕边缘。有没有办法设置 DecimalFormat 或其他一些类来削减尾随零,同时保持不合理性完好无损?

【问题讨论】:

  • 双精度不能代表无理值...
  • 带有0.### 的DecimalFormat 会做这样的事情。当然double 只是浮点数的近似值。也许使用 BigDecimal,但这也是一个最终类。
  • @JoopEggen 小数点前的零将允许超过单位的位置,例如 234123412.1?抱歉,我以前从未使用过 DecimalFormat。
  • 是的,顺便说一句,DecimalFormat 不会修改原始值。

标签: java double decimalformat


【解决方案1】:

如果您愿意切换到BigDecimal,有一个#stripTrailingZeroes() 方法可以完成此操作。

【讨论】:

  • 这会影响生成的字符串表示吗?
  • 但是这不是把600.0这样的数字放在科学计数法中吗?
  • @Jesse Rusak:是的。 @Mohit:如果您使用 #toPlainString() 输出,则不会。
【解决方案2】:

您可以使用字符串操作来删除尾随零。

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));

【讨论】:

  • 我认为最后一个“替换”应该更像:.replaceAll("\\.$", "");
【解决方案3】:

私有静态字符串 removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll("[0]*$", "").replaceAll(".$", "");
}

私有静态字符串 removeTrailingZeros(double d) {
return String.valueOf(d).replaceAll(".?0*$", "");
}

这些是错误的代码。

System.out.println(removeTrailingZeros(1234.23432400000));
返回:1234.23432
但必须返回:1234.234324


私有静态字符串 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

当前主题“从双精度中删除尾随零”的完美分辨率正在使用
.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(正确)

【讨论】:

  • 请根据help document编辑代码块。在大多数情况下,您实际上并不需要 HTML 标签。
【解决方案4】:
double result = ...;
int intResult = (int)result;
if (result == intResult) {
    System.out.println(intResult);
} else {
    System.out.println(result);
}

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2012-07-01
    • 2011-05-30
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多