Best way to Format a Double value to 2 Decimal places
Possible Duplicate:
Round a double to 2 significant figures after decimal point
在我的应用程序中,我处理大量的双值,有什么简单的方法来处理Java中十进制值的格式吗?
还有比这更好的方法吗
我要做的基本上是格式化双值,比如
1 2 3 4 5 6 7
| 23.59004 to 23.59
35.7 to 35.70
3.0 to 3.00
9 to 9.00 |
- 比另外一行容易吗?我很确定这是最简单、最清晰的十进制格式。请注意,如果此程序将由不同地区的人使用,decimalFormat将根据需要使用","或"."作为小数分隔符。这在我最近正在进行的一个项目中引起了一些问题:写入一个文本框并从中读取错误的值。
- 这正是我非常担心的,我在默认的区域中看到了decimalformat。你能告诉我你是如何使用本地化的吗?
- 我使用jFormattedTextFields进行输入,使用setValue()填充它们,并使用getValue()从中读取。对于需要十进制的地方,我使用了decimalFormatSymbols对象。
- 使用Math.round()方法也比较容易。这里是解决这个问题的主题:链接
不,没有更好的方法。
实际上,您的模式中有一个错误。你想要的是:
注意"00",正好是两位小数。
如果您使用"#.##"(#表示"可选"数字),它将删除尾随零,即new DecimalFormat("#.##").format(3.0d);只打印"3",而不是"3.00"。
- 实际上,用格式化3.0将打印3。
- 0.99会转换成0.99还是0.99?
- @mubasharahmad ".99"—#表示"可选零"。如果要保留前导零(即输出"0.99"),请使用模式"#0.00"。
- 您可以使用string num=string.format("%.2f",23.59004);然后打印num。它将打印23.59。
- 根据@ohcibi的链接,这不是唯一的方法。String.format也可以做到,而且工作起来也比较容易。
- 请注意,decimalformat将根据当前机器的位置更改分隔符。因此,将值打印到屏幕上是可以的,但如果必须将值发送到其他地方(例如,数据库),则不可靠。这同样适用于string.format()。
- @波西米亚人,我刚运行了一个0.99的程序,并且保持前导零。显示屏0.99
- 如果希望确保具有常量分隔符,请参阅stackoverflow.com/questions/5054132/…。
- 接受的答案不适用于0.01到0.99之间的值。正确的一个应该是:decimalformat df=new decimalformat("0.00");
- 不是完美的,比如当值为0.01时,你只得到.01。
- 根据JavaDoc,decimalformat不是线程安全的。不过,如果您同步对格式化程序的访问,这个答案就可以正常工作。
- @AKAGIXXER大多数原始类INjava.text不是线程安全的。我不想费心同步;只要每次创建一个新的:new DecimalFormat("#.00").format(myNumber)。
- @波西米亚式是的,另一个有效的选择。我只是提到,因为不是每个人都知道。对于这些实用程序中的大多数来说,线程本地实例的性能比每次重新初始化新实例的开销更高。和所有事情一样,它只取决于应用程序将如何使用它,以及哪种解决方案是最好的(即,不同步、同步、每次都是新的、线程本地的等等)。
另一种选择是使用String.format:
1 2 3 4 5 6 7 8 9
| double[] arr = { 23.59004,
35.7,
3.0,
9
};
for ( double dub : arr ) {
System. out. println( String. format("%.2f", dub ) );
} |
输出:
1 2 3 4
| 23.59
35.70
3.00
9.00 |
您还可以使用System.out.format(相同的方法签名),或者创建一个以相同方式工作的java.util.Formatter。