Java 十进制格式:逗号后的数字错误

Java 十进制格式:逗号后的数字错误,java,format,decimal,decimalformat,Java,Format,Decimal,Decimalformat,我对十进制有问题。在我的代码中,我有: Double value = 1.40; DecimalFormat df = new DecimalFormat("###,###,###.00########"); df.setGroupingUsed(true); df.setDecimalSeparatorAlwaysShown(true); System.out.println(df.format(value)); 现在,有了这段代码,理论上,我应该: 1.40 但是,当格式化值时,我有如下输

我对十进制有问题。在我的代码中,我有:

Double value = 1.40;
DecimalFormat df = new DecimalFormat("###,###,###.00########");
df.setGroupingUsed(true);
df.setDecimalSeparatorAlwaysShown(true);
System.out.println(df.format(value));
现在,有了这段代码,理论上,我应该:

1.40

但是,当格式化值时,我有如下输出:

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
    ((DecimalFormat) f).applyPattern("###,###,###.00########");
}
1.39999762


为什么会发生这种情况?我如何解决它?谢谢你的回答

这不是
十进制格式的问题,而是。某些数字不能用这种方式表示,所以你可以得到它们的近似值——就像你的例子一样

使用
BigDecimal
是一种可能的解决方案。

您应该避免直接使用。您可以这样尝试:

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
    ((DecimalFormat) f).applyPattern("###,###,###.00########");
}

使用是一个很好的选择

甲骨文文档说:

获取特定区域设置的NumberFormat,包括默认值 locale,调用NumberFormat的工厂方法之一,例如 getInstance()。通常,不调用十进制格式 构造函数直接,因为NumberFormat工厂方法可能 返回DecimalFormat以外的子类


看看这个:好吧,我不能复制这个。你没告诉我们什么?这段代码正是您正在运行的代码吗?您确定没有编写
Double value=1.40F在第一行?我解决了,谢谢你的帮助!如果你解决了这个问题,那么你应该在这里发布你的解决方案,这对未来有类似问题的用户来说是有益的。许多
double
值比
1.39999762
更接近
1.40
。@DavidWallace 1.39999762是四舍五入到第十位的正确数字否,不是。双精度比这精确得多。如果这是一个浮点数,而不是一个双精度浮点数,这将是正确的。@DavidPostill哦,谢谢,没有看到这是一篇德国文章。Fixed@DavidWallace你说得对,这是正确的浮点数。谢谢