如何从双精度中删除尾随零 [重复]

Posted

技术标签:

【中文标题】如何从双精度中删除尾随零 [重复]【英文标题】:How to remove trailing zeros from a double [duplicate] 【发布时间】:2012-12-21 17:03:43 【问题描述】:

例如,我需要将5.0 变为5,或将4.3000 变为4.3

【问题讨论】:

注意:与链接问题中的最佳答案不同,所有这些答案都依赖于仅保留一位小数的预期输入。超过一位小数的所有内容都将被四舍五入,这可能不是理想的行为。 这很难看,但它确实有效:String.format(doubleVal).replaceAll("\\.0+$", ""); P.S.最终使用了这个: DecimalFormat("#.################").format(doubleVal); // 如果小数部分为 0,这将确保没有尾随零和分隔符(有一个特殊的方法 setDecimalSeparatorAlwaysShown(false),但默认情况下似乎已经禁用)。但会产生最多 16 位小数部分(如果您认为 16 位不够,您可以在此处添加更多 #)。 【参考方案1】:

你应该使用DecimalFormat("0.#")


对于4.3000

Double price = 4.3000;
DecimalFormat format = new DecimalFormat("0.#");
System.out.println(format.format(price));

输出是:

4.3

如果是 5.000,我们有

Double price = 5.000;
DecimalFormat format = new DecimalFormat("0.#");
System.out.println(format.format(price));

输出是:

5

【讨论】:

这会使5.0 变为5 的情况失败,因为它总是会在数字末尾添加.0 感谢您的评论。现在我发现我应该使用 0.#. 4.32变成4.3的情况下失败 @Chisko 问题询问如何“删除尾随零”。 双重类型不能真正做到这一点。如果你愿意改用 BigDecimal,here's the solution。【参考方案2】:

使用DecimalFormat

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

【讨论】:

这不会像 5.000001 的情况那样围绕数字进行 确实如此,这就是为什么这是错误的......【参考方案3】:

使用格式字符串为“0.#”的 DecimalFormat 对象。

【讨论】:

这在 4.32 变成 4.3 的情况下失败 公平点,虽然 OP 没有说明需要多少个地方。我想不出一个很好的理由来截断尾随的 0,但在可打印的范围内保留非零。恕我直言,在打印双精度时,代码应指定所需的精度位数(句点后的 # 数)。 @Karoly DecimalFormat df = new DecimalFormat("###.##"); df.setRoundingMode(RoundingMode.HALF_UP); System.err.println(df.format(4.325)); System.err.println(df.format(4.30)); System.err.println(df.format(4.00)); @dashrb OP 对他想要什么非常明确。他想删除尾随零。你明白“尾随”这个词是什么意思吗? @UncleIroh 仅供参考,即使在删除 RoundingMode.HALF_UP 但保留 #.###

以上是关于如何从双精度中删除尾随零 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何舍入双精度值但保持尾随零

JavaScript - 保持尾随零[重复]

如何删除字符串中的前导零和尾随零? Python

如何从 Pandas 日期时间索引中删除尾随零(根据需要格式化)?

如何在 WebApi IActionResult Ok() 函数中删除可空小数的尾随零?

将工作代码从双精度转换为四精度:如何从输入文件中读取 FORTRAN 中的四精度数字