将 Double 值格式化为 2 个小数位的最佳方法 [重复]

Posted

技术标签:

【中文标题】将 Double 值格式化为 2 个小数位的最佳方法 [重复]【英文标题】:Best way to Format a Double value to 2 Decimal places [duplicate] 【发布时间】:2012-02-07 20:13:22 【问题描述】:

我在我的应用程序中处理大量双精度值,有没有什么简单的方法可以在 Java 中处理十进制值的格式?

有没有比这个更好的方法

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

我想要做的基本上是像

这样格式化双精度值
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() 方法。解决这个问题的话题在这里:link 【参考方案1】:

不,没有更好的办法。

实际上,您的模式有错误。你想要的是:

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

注意"00",意思是正好两位小数。

如果您使用"#.##"# 表示“可选”数字),它将删除尾随零 - 即new DecimalFormat("#.##").format(3.0d); 仅打印"3",而不是"3.00"

【讨论】:

其实用#.##格式化3.0会打印3. @MubasharAhmad ".99" - # 表示“可选零”。如果要保留前导零(即输出"0.99"),请使用模式"#0.00" 你可以使用 String num = String.format("%.2f",23.59004);然后打印数字。它将打印 23.59。 请注意,DecimalFormat 会根据当前机器的语言环境更改分隔符。因此,可以将值打印到屏幕上,但如果您必须将值发送到其他地方进行解析(例如:数据库),则不可靠。这同样适用于 String.format()。 @Bohemian 是的,另一个有效选项。我只是提到这一点,因为不是每个人都知道这一点。对于大多数这些实用程序,ThreadLocal 实例的性能比每次重新初始化一个新实例的开销都要高。就像所有事情一样,它只取决于应用程序将如何使用它以及哪种解决方案是最好的(即不同步、同步、每次都是新的、ThreadLocal 等)。【参考方案2】:

另一种方法是使用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

【讨论】:

这也适用于像0这样的数字。# String.format 会向上还是向下取整? @jumping_monkey 你可以自己试试 ;) 它进行标准舍入,即舍入到最近 呵呵,我试图改进答案,让读者不需要尝试;-)。谢谢朋友。

以上是关于将 Double 值格式化为 2 个小数位的最佳方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将十进制值格式化为具有 2 个小数位的货币 [重复]

在 jQuery 中,将数字格式化为 2 位小数的最佳方法是啥?

如何将双精度值格式化为点后两位小数且分隔符为千位的字符串?

将浮点数格式化为 n 位小数

格式化此数字的最佳方法是啥?

将 BigDecimal 格式化为最多 2 个十进制数字的字符串,在小数部分删除 0