【问题标题】:Java - always keep two decimal places even in zeroesJava - 即使为零也始终保留两位小数
【发布时间】:2013-12-26 02:58:27
【问题描述】:

我试图保留两位小数,即使数字为零,使用DecimalFormatter

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

m_interest   = Double.valueOf(df.format(m_principal * m_interestRate));
m_newBalance = Double.valueOf(df.format(m_principal + m_interest - m_payment));
m_principal  = Double.valueOf(df.format(m_newBalance));

但是,对于某些值,这给出了两位小数,而对于其他值则没有。我该如何解决这个问题?

【问题讨论】:

  • 你能举一个没用的例子吗?
  • 你确定吗?我会为我的格式字符串使用“#0.00”,但这应该并且将会起作用。我不得不怀疑你是否真的在运行上面显示的代码。
  • 可能是因为你在做Double.valueOf。不过,只是猜测。
  • 您在打印之前是否使用DecimalFormat 格式化m_interest?因为我可以看到您在最终结果上执行Double.valueOf(),如果您要这样打印,那么您一定会得到不同的小数点。

标签: java decimalformat


【解决方案1】:

这是因为您在DecimalFormat 上使用Double.valueOf 并将格式化数字转换回双精度数,因此消除了尾随的0。

要解决此问题,请仅在显示值时使用DecimalFormat

如果您需要 m_interest 计算,请将其保留为常规 double

然后在显示的时候,使用:

System.out.print(df.format(m_interest));

例子:

DecimalFormat df = new DecimalFormat("#.00");
double m_interest = 1000;
System.out.print(df.format(m_interest)); // prints 1000.00

【讨论】:

  • 但我需要将值作为双倍发送。这里 df.format() 输出是字符串类型的。我可以以某种方式发送双值作为 10.00,而不是 10.0 吗?还是我根本做不到?
  • @ChandraBhanSingh 这真的没有意义。 double 是一个数值;它没有被格式化为尾随零。如果您需要以某种方式打印号码,请在此之前使用df.format()。除了打印数字外,您还可以将其保留为小数。你有什么情况?
  • 在我的项目中,我们签署了一份文件,明确提到双精度值将关闭 4 精度。现在客户就像我们想要小数点后的那 4 个零,我真的很困惑如何实现这一点。感谢您能告诉我一些朗朗上口的陈述,这样我就可以说服他。我通过 JAX-WS webservice 发送这些值。
【解决方案2】:

DecimalFormat NumberFormat 应该可以正常工作。货币实例可以更好地工作

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Foo {
   public static void main(String[] args) {
      DecimalFormat df = new DecimalFormat("#0.00");

      NumberFormat nf = NumberFormat.getInstance();
      nf.setMinimumFractionDigits(2);
      nf.setMaximumFractionDigits(2);

      NumberFormat cf = NumberFormat.getCurrencyInstance();

      System.out.printf("0 with df is: %s%n", df.format(0));
      System.out.printf("0 with nf is: %s%n", nf.format(0));
      System.out.printf("0 with cf is: %s%n", cf.format(0));
      System.out.println();
      System.out.printf("12345678.3843 with df is: %s%n",
            df.format(12345678.3843));
      System.out.printf("12345678.3843 with nf is: %s%n",
            nf.format(12345678.3843));
      System.out.printf("12345678.3843 with cf is: %s%n",
            cf.format(12345678.3843));
   }
}

这将输出:

0 with df is: 0.00
0 with nf is: 0.00
0 with cf is: $0.00

12345678.3843 with df is: 12345678.38
12345678.3843 with nf is: 12,345,678.38
12345678.3843 with cf is: $12,345,678.38

【讨论】:

    【解决方案3】:

    改用 BigDecimal,它支持您寻求的格式化方法。

    这个问题详细说明:How to print formatted BigDecimal values?

    【讨论】:

    • 哦,它有开销?那会是什么?如果你在赚钱,BigDecimal 就是你的做法。
    • 对不起,你是对的。所有财务计算都应使用 BigDecimal 完成。我收回我之前的评论。再次,对不起。 1+
    • 正如@Rob 指出的那样,使用 BigDecimal 并不是因为可用的格式,而是因为它使用无限精度,而 Double 将进行舍入,这对于货币计算来说是不可取的。跨度>
    【解决方案4】:
    m_interest = Double.valueOf(String.format("%.2f", sum));
    

    【讨论】:

    • 虽然这段代码可能会回答这个问题,但最好在不介绍其他人的情况下解释如何它解决问题以及为什么要使用它。从长远来看,纯代码的答案没有用处。
    【解决方案5】:

    你为什么不简单 Math.round(value * 100) / 100.0 ?

    【讨论】:

    • 这正是他的问题所在。他需要它显示尾随的 0。四舍五入将消除它们。这也不是答案,而是问题,因此应该是评论。
    • 对不起,我不认为 Double.valueOf() 关心那些 0,因此我想麻烦格式化是多余的。
    • 是的,Double.valueOf() 是他的问题。这就是我们试图为他解决的问题。请阅读他的问题。
    猜你喜欢
    • 2023-03-05
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多