Java十进制格式格式错误

时间:2015-04-22 12:43:20

标签: java decimalformat

代码是:

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

enter image description here

3 个答案:

答案 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.printlnExpressions 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算术的舍入策略。