用正确的小数位格式化数字

Posted

技术标签:

【中文标题】用正确的小数位格式化数字【英文标题】:Formatting a number with correct decimal scale 【发布时间】:2012-08-08 05:58:49 【问题描述】:

我需要格式化一个小数点后 2 位的数字。原始数字可以是整数,也可以是小数点后三位的数字。然而,无论原始数字是整数还是小数位,结果都应格式化为逗号和两位小数。

    当原始 num = 56565656.342 ==> 我需要 56,565,656.34 当原始 num = 56565656 ==> 我需要 56,565,656.00 当原始 num = 56565656.7 ==> 我需要 56,565,656.70

我正在使用以下代码格式化代码,但在上述 2 和 3 种情况下未能添加两位小数。

String originalNumber = "56565656.7";
BigDecimal b = new BigDecimal(originalNumber).setScale(2, BigDecimal.ROUND_HALF_UP);
String formattedNumber = NumberFormat.getInstance().format(b);

如果有任何方法可以有效地完成此任务,请告诉我。

提前致谢。

【问题讨论】:

【参考方案1】:

看看DecimalFormat 类。

您也可以使用 BigDecimal 类中的 setScale 方法。

        BigDecimal bg1 = new BigDecimal("56565656.342");
        BigDecimal bg2 = new BigDecimal("56565656.00");
        BigDecimal bg3 = new BigDecimal("56565656.70");

        DecimalFormat df = new DecimalFormat("###,###.00");
        System.out.println(df.format(bg1.doubleValue()));
        System.out.println(df.format(bg2.doubleValue()));
        System.out.println(df.format(bg3.doubleValue()));

        System.out.println(bg1.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bg2.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bg3.setScale(2, BigDecimal.ROUND_HALF_UP));

产量:

56,565,656.34
56,565,656.00
56,565,656.70
56565656.34
56565656.00
56565656.70

编辑:还忘了提及:如果您追求精度,我建议您使用setScale 方法,使用.doubleValue() 方法会产生double,这可能会导致精度损失。

【讨论】:

如果在构造DecimalFormatDecimalFormat df = new DecimalFormat("###,###.00");时使用下面的语句,前三个println会打印小数点后2位。【参考方案2】:

只需使用NumberFormat 并指定小数位数和舍入方法即可打印:

String [] originalNumbers = new String[] 
   "56565656.342",
   "56565656.7",
   "56565656"
;

NumberFormat df = NumberFormat.getInstance();
df.setMinimumFractionDigits(2);
df.setMaximumFractionDigits(2);
df.setRoundingMode(RoundingMode.HALF_UP);

for (String number : originalNumbers) 
   String formattedNumber = df.format(new BigDecimal(number));

   System.out.println(formattedNumber);

将打印

56,565,656.34
56,565,656.70
56,565,656.00

** 编辑 **

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

将产生与上面给定代码完全相同的结果。

【讨论】:

【参考方案3】:

DecimalFormat 类会为您执行此操作....您必须指定适当的格式。

【讨论】:

你的回答太模糊了。如果你只花几行来解释某事,而你没有提供一行代码,那么你可以肯定答案是不够的。

以上是关于用正确的小数位格式化数字的主要内容,如果未能解决你的问题,请参考以下文章

用逗号格式化数字PHP [重复]

在Java中格式化带有小数位的数字符号而不进行除法的正确方法

为啥 ToString 使用不正确的小数分隔符格式化数字

用小数格式化数字

Android - 如何正确地将字符串解析为浮点数(价格数字格式:整数、小数或两者兼有)

JS对数字进行货币格式化并且保留两位小数点,小数用0补全