如何从双精度浮点数中删除末尾的零

77
例如,我需要将 5.0 转换为 5,或者将 4.3000 转换为 4.3

11
注:与链接问题中的最佳答案不同,所有这些答案都依赖于仅期望一个小数位的输入。超过一个小数位的一切内容都将被四舍五入,这可能不是期望的行为。 - tommoyang
1
这个代码看起来很丑,但它能正常工作:String.format(doubleVal).replaceAll("\.0+$", ""); - mvmn
4
最终使用了这个方法:DecimalFormat("#.################").format(doubleVal); // 这可以确保没有多余的零和如果小数部分为0则没有分隔符(有一个特殊的方法setDecimalSeparatorAlwaysShown(false)可以实现,但似乎已经默认禁用了)。但是会产生最多16位小数(如果你认为16位不够可以在#后面添加更多数字)。 - mvmn
3个回答

110

你应该使用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

6
这无法实现将 5.0 转换为 5 的情况,因为它会在数字末尾始终添加 .0 - Peter Elliott
2
谢谢您的评论。现在我已经明白,我应该使用0.#。 - Marcin Szymczak
44
在“4.32”这种情况下,这种方法失败了,因为它会变成“4.3”。 - David Conrad
14
这个问题问如何“去除尾随零”。 - David Conrad
3
一个double类型无法真正做到这一点。如果你愿意切换到BigDecimal,这里有解决方案 - Rok Povsic
显示剩余5条评论

7

Use DecimalFormat

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

13
这会像5.000001的情况一样舍入数字吗? - VikrantY
54
这是错误的,因为它确实如此... - Mostafa Zeinali

1

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


17
这在4.32的情况下失败了,它变成了4.3。 - narancs
1
公正的观点,尽管OP没有指出需要多少位。我想不出截断尾随0但保留非零数字的好理由,只要它们可打印。在我看来,当打印双精度时,代码应该指定所需的精度位数(小数点后的数字数量)。 - dashrb
1
@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));@Karoly 十进制格式化对象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)); - Uncle Iroh
2
@dashrb OP非常明确地表达了他想要的。他想要删除尾随的零。你明白“尾随”这个词的意思吗? - Peter Schorn
@UncleIroh FYI,即使删除RoundingMode.HALF_UP但保留#.###,这仍然提供了正确的解决方案。 - Prabhat Gaur
"0.##" 将返回 4.32 而不是四舍五入的值。 - xiang

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