代码是:
private static DecimalFormat amDF=new DecimalFormat("###,###,###,##0.00");
amDF.setDecimalFormatSymbols(dfs); <- this only sets decimal separator, it works fine
amDF.setMinimumFractionDigits(2);
amDF.setMaximumFractionDigits(2);
在格式化值之前是210103.6,格式化之后应该是:210.103,60,而不是210.103,59。
为什么我会输掉0.01?
编辑#1:number是类Float编号的实例
编辑#2:numberOfDecimals = 2
答案 0 :(得分:1)
在java中使用float时,您会看到精度的限制。它的32位精度根本不足以满足您的使用目的。
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
float:float数据类型是单精度32位IEEE 754浮点。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型,格式和值部分中指定。与byte和short的建议一样,如果需要在大型浮点数数组中保存内存,请使用float(而不是double)。 此数据类型永远不应用于精确值,例如货币。 为此,您需要使用java.math.BigDecimal类。
您可以通过将数字类型更改为double来演示此问题。在这种情况下,您的DecimalFormat.format()输出正确的值,因为double具有足够的精度来保存您正在使用的数字。
final DecimalFormat df = new DecimalFormat("###,###,###,##0.00");
df.setMinimumFractionDigits(2);
df.setMaximumFractionDigits(2);
System.out.println(df.format(210103.6f));
=&GT; 210.103,59
final DecimalFormat df = new DecimalFormat("###,###,###,##0.00");
df.setMinimumFractionDigits(2);
df.setMaximumFractionDigits(2);
System.out.println(df.format(210103.6d));
=&GT; 210.103,60
答案 1 :(得分:0)
这是eclipse中Expressions tab
的有趣行为我试图在调试模式下运行简单代码:
public static void main( String[] args ) throws Exception
{
float number = 210103.59f;
System.out.println( number );
}
如果断点与System.out.println
和Expressions tab
一致,我会看到与 210103.6 完全相同的值。
答案 2 :(得分:0)
你可以:
(扔掉:):
amDF.setMinimumFractionDigits(2);
amDF.setMaximumFractionDigits(2);
//,because it is already "in the format"
并将其替换为:
amDF.setRoundingMode(java.math.RoundingMode.UP);
,因为HALF_EVEN是:
...有时被称为“银行家的四舍五入”,主要用于美国。这种舍入模式类似于Java中用于float和double算术的舍入策略。