【问题标题】:How to display BigDecimal value in a human readable format?如何以人类可读的格式显示 BigDecimal 值?
【发布时间】:2014-02-24 04:59:17
【问题描述】:

假设我们有一个像这样设置的 BigDecimal 变量,我们不能改变它的创建方式:

BigDecimal num = new BigDecimal(6.0053);

所以我们将在输出后看到以下“漂亮”值:

System.out.println(num);   //0053000000000000824229573481716215610504150390625

我发现解决此问题的唯一方法是使用 BigDecimal.valueOf():

System.out.println(BigDecimal.valueOf(num.doubleValue()));   //6.0053

但是有更简单的解决方案吗?

提前致谢。

【问题讨论】:

  • 不要使用 new BigDecimal(double) 构造函数 - 它会创建不精确的值:stackoverflow.com/questions/3829029/…
  • 好吧,根本问题在于值,它并不代表您希望它代表的内容。你说你不能改变它的创建方式,但你应该真正关注这一点,因为这就是问题的开始。其他任何东西都只是掩盖裂缝。
  • @Natix:不,它创建了非常精确的值——只是不是你可能期望的值。我不同意此处有关“不可预测性”的文档 - 结果是可预测的,但您需要先了解发生了什么。
  • 谢谢 Jon,我知道问题出在创作上,并且只对一些快速而肮脏的解决方法感兴趣。

标签: java


【解决方案1】:

使用java.text.DecimalFormat 格式化数字。

NumberFormat format = new DecimalFormat("0.####");
System.out.println(format.format(num));

格式选项可以找到here

【讨论】:

  • 我敢打赌它不会比 BigDecimal.valueOf(num.doubleValue()) 更简单。我想知道有没有非常简单的解决方案?
  • @XpressOneUp 确实不,而且这张海报没有声明,但它也会提供特定的小数位数,避免科学记数法,以及你可能需要但可能不知道的各种其他东西大约还。您的选择。
【解决方案2】:
BigDecimal num = new BigDecimal(6.0053);
DecimalFormat df=new DecimalFormat("0.0000");
System.out.println(df.format(num));

【讨论】:

    【解决方案3】:

    您可以将String.format 与“g”格式类型一起使用。它允许您控制所需的位数等。有关所有格式选项,请参阅here

    BigDecimal num = new BigDecimal(6.0053);
    String formated = String.format("%6.5g", num);
    System.out.println(formated);
    

    (结果:6.0053

    【讨论】:

      【解决方案4】:
      System.out.println(new DecimalFormat("###,##0.00").format(myBigDecimalVariable));
      

      【讨论】:

      • BigDecimals 是数字,因此可以传递给 DecimalFormat,无需先将它们转换为 double(精度损失和较小的数字范围)。
      • 没错,不知道……会编辑我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 2011-12-25
      • 2016-12-28
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多