将Double类型的值格式化为2位小数的最佳方法

322

我在我的应用中涉及了很多双精度数值,请问有没有简单的方法来处理Java中的十进制格式化?

除此外,还有其他更好的方法吗?

 DecimalFormat df = new DecimalFormat("#.##");

我想做的基本上是像这样格式化双精度值:

23.59004  to 23.59

35.7  to 35.70

3.0 to 3.00

9 to 9.00

1
比一行额外的代码更容易吗?我相信这是格式化十进制数最简单、最清晰的方式。请注意,如果此程序将由不同地区的人使用,则 DecimalFormat 将使用逗号或点作为十进制分隔符。这在我最近参与的一个项目中引起了一些问题:向文本框写入并从中读取错误的值。 - Dogmatixed
1
这正是我非常担心的事情,我读到 DecimalFormat 默认使用本地语言环境。您能告诉我如何在本地化方面使其工作吗? - Rajesh Pantula
我使用JFormattedTextFields进行输入,使用setValue()填充它们,并使用getValue()从中读取。对于需要小数的地方,我使用DecimalFormatSymbols对象。 - Dogmatixed
1
还有一种更简单的方法,使用 Math.round() 方法。解决此问题的主题在这里:链接 - frank17
2个回答

535

不,没有更好的方法。

实际上你的模式有误。你需要的是:

DecimalFormat df = new DecimalFormat("#.00"); 

注意 "00",意味着精确到小数点后两位。

如果您使用的是 "#.##"(其中 # 表示“可选”数字),它将删除尾部零 - 例如 new DecimalFormat("#.##").format(3.0d); 只会打印出 "3",而不是 "3.00"


1
0.99会被转换为.99还是0.99? - Mubashar
40
@MubasharAhmad ".99"#代表可选的零。如果您想保留前导零(即输出为"0.99"),请使用模式"#0.00" - Bohemian
11
你可以使用String num = String.format("%.2f",23.59004);,然后打印num。它会输出23.59。 - Manoj
7
请注意,DecimalFormat会根据当前机器的语言环境更改分隔符。 因此,在屏幕上打印值是可以的,但如果您必须将值发送到其他地方进行解析(例如:数据库),则不可靠。 String.format()也同样适用。 - capitano666
1
@Bohemian 是的,另一个有效的选择。我只是提到这个因为并不是每个人都知道它。对于大多数这些实用程序来说,存在这样一种情况:ThreadLocal<> 实例比每次重新初始化新实例的开销更高效。像所有东西一样,这取决于应用程序将如何使用它以及哪种解决方案最好(即非同步、同步、每次新建、ThreadLocal 等)。 - akagixxer
显示剩余8条评论

380

另一种方法是使用String.format

double[] arr = { 23.59004,
    35.7,
    3.0,
    9
};

for ( double dub : arr ) {
  System.out.println( String.format( "%.2f", dub ) );
}

输出:

23.59
35.70
3.00
9.00

你也可以使用 System.out.format (方法签名相同),或创建一个以相同方式工作的 java.util.Formatter


1
这也适用于像0.#这样的数字。 - vantesllar
String.format 会四舍五入吗? - jumping_monkey
1
@jumping_monkey 你可以自己试试;) 它执行标准舍入,即四舍五入。 - OpenSauce
呵呵,我正在尝试“改进”答案,这样读者就不需要再尝试了;-)。谢谢伙计。 - jumping_monkey

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