Java-始终保留两位小数,即使是零

Java-始终保留两位小数,即使是零,java,decimalformat,Java,Decimalformat,我尝试使用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 =

我尝试使用
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));

但是,对于某些值,这会给出两个小数位,而对于其他值,则不会。如何解决此问题?

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

这个问题详细说明了这一点:

十进制格式和数字格式应该可以正常工作。货币实例可以更好地工作:

这将产生:

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

为什么不简单地计算.round(value*100)/100.0?

这是因为您在
十进制格式上使用了
Double.valueOf
,它将格式化的数字转换回Double,从而消除了尾随的0

若要解决此问题,请仅在显示值时使用
十进制格式。

如果您需要
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

你能举个不起作用的例子吗?你确定吗?我会使用“#0.00”作为我的格式字符串,但这应该也会起作用。我想知道您是否正在运行上面显示的代码。可能是因为您正在执行
Double.valueOf
。不过,我只是猜测一下。在打印之前,您是否使用
DecimalFormat
格式化
m_interest
?因为我可以看到你对最终结果做了
Double.valueOf()
,如果你要这样打印,那么你肯定会得到不同的小数点。接下来。哦,它有开销吗?那会是什么?如果你在做钱,BigDecimal就是你如何做的。对不起,你是对的。所有财务计算均应使用BigDecimal进行。我收回我先前的评论。再一次,对不起。1+正如@Rob指出的,使用BigDecimal并不是因为可用的格式,而是因为它使用了无限精度,而Double将受到舍入的影响,这对于货币计算来说是不可取的。这正是他的问题所在。他需要它来显示他的身份。四舍五入将消除它们。这也不是一个答案,这是一个问题,因此应该是一个评论。对不起,我不认为Double.valueOf()关心那些0,因此我想麻烦设置格式是过分的。是的,
Double.valueOf()
是他的问题。这就是我们试图为他解决的问题。请阅读他的问题。虽然这段代码可以回答这个问题,但最好在不介绍其他人的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案是没有用的。但我需要将值作为double发送。此处df.format()输出为字符串类型。我是否可以发送双倍值作为10.00,而不是10.0?“或者我一点也不能?”钱德拉汉辛说,这真的没有道理。双精度是一个数值;它的格式不允许有尾随的零。如果您需要以某种方式打印数字,请先使用
df.format()
。除了打印数字外,您还可以将其保留为十进制。关于你的情况是什么?在我的项目中,我们已经签署了一份文件,明确提到双倍值将失去4精度。现在客户端就像我们想要小数点后的4个零,我真的很困惑如何实现这一点。如果你能告诉我一些吸引人的话,我会非常感激,这样我就可以说服他。我通过JAX-WSWebService发送这些值。
DecimalFormat df = new DecimalFormat("#.00");
double m_interest = 1000;
System.out.print(df.format(m_interest)); // prints 1000.00
m_interest = Double.valueOf(String.format("%.2f", sum));