【问题标题】:How to display a number with always 2 decimal points using BigDecimal?如何使用 BigDecimal 显示始终有 2 个小数点的数字?
【发布时间】:2013-01-25 05:01:19
【问题描述】:

我正在使用 BigDecimal 来获取一些价格值。要求是这样的,无论我们从数据库中获取什么值,显示的值都应该有 2 个小数点。

例如:

获取的值为 1 - 应显示为 1.00
获取的值为 1.7823 - 应显示为 1.78

我正在使用setScale(2, BigDecimal.ROUND_HALF_UP),但仍有一些地方,如果数据库中的数据是整数,那么会显示相同的数据!!

我的意思是如果数据库中的值为 0,则它仅显示为 0。我希望它显示为 0.00

谢谢

【问题讨论】:

  • 我想你可以在这里找到答案:stackoverflow.com/a/50543/61624
  • 感谢 daniel :) 回复太快了.. 但我已经在使用带有 setscale(2) 的 bigdecimal.round_half_up,当你有 2.12 或 4.2343 之类的数字时它可以工作。当值是像 2 这样的整数时,我希望它显示为 2.00,这就是我失败的地方!

标签: java precision bigdecimal decimal-point


【解决方案1】:

BigDecimal 是不可变的,对它的任何操作包括 setScale(2, BigDecimal.ROUND_HALF_UP) 都会产生一个新的 BigDecimal。正确的代码应该是

BigDecimal bd = new BigDecimal(1);
bd.setScale(2, BigDecimal.ROUND_HALF_UP); // this does change bd
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(bd);

输出

1.00

注意 - 由于 Java 9 BigDecimal.ROUND_HALF_UP 已被弃用,您现在应该使用 RoundingMode.ROUND_HALF_UP

【讨论】:

  • 自 Java 9 起已弃用,请使用 .setScale(2, RoundingMode.HALF_UP);
【解决方案2】:

你可以使用向上取整的格式

BigDecimal bd = new BigDecimal(2.22222);
System.out.println(bd.setScale(2,BigDecimal.ROUND_UP));

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    要在 JAVA 中格式化数字,您可以使用:

     System.out.printf("%1$.2f", d);
    

    其中 d 是您的变量或数字

     DecimalFormat f = new DecimalFormat("##.00");  // this will helps you to always keeps in two decimal places
     System.out.println(f.format(d)); 
    

    【讨论】:

    • 最好使用new DecimalFormat("##0.00");,因为将##.00 用于0 你会得到.00 而不是0.00
    【解决方案4】:

    您需要使用 NumberFormat 之类的内容,并将适当的语言环境设置为 format

    NumberFormat.getCurrencyInstance().format(bigDecimal);
    

    【讨论】:

    • 这将打印货币符号,例如$,以及 OP 没有提到他想要的号码。但就像为了可读性而在这里使用货币实例的想法一样。
    【解决方案5】:

    BigDecimal.setScale 可以工作。

    【讨论】:

      【解决方案6】:

      下面的代码可能会有所帮助。

      protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
          final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
          numberFormat.setGroupingUsed(true);
          numberFormat.setMaximumFractionDigits(2);
          numberFormat.setMinimumFractionDigits(2);
          return numberFormat.format(input);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 2011-01-01
        • 2014-05-03
        • 2016-06-01
        • 2011-09-02
        相关资源
        最近更新 更多