DecimalFormat返回错误的结果

时间:2016-08-18 02:30:31

标签: java android math decimalformat

有人知道我在这里做错了吗?我有一个浮点数,比方说它是0.04。格式化后,它变为0.03。显然输出结果已经比输入值低0.01。

这是我的代码:

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
        DecimalFormat decimalFormat =  new DecimalFormat("#.##");
        decimalFormat.setRoundingMode(RoundingMode.FLOOR);
        float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));

        return Math.min(1.0f, formattedCreditAvailableProportion);

提前致谢。

3 个答案:

答案 0 :(得分:2)

由于没有人解释过这个问题,让我简要解释一下发生了什么。大多数系统中的浮动数字(包括java)都不准确。这意味着.04,内部存储例如.03999999999或.040000001或类似的东西。因此,当您使用地板格式进行格式化时,最终可能会使用.03。 解决方案是使用舍入格式,或者在格式化之前将值添加.0000001。这样,即使是地板也能正确使用。
另一种方法是,如果可能的话,完全转储浮点数,并使用整数(如1e6),类似于Android对地理坐标的处理。

答案 1 :(得分:0)

如何调试:

运行此代码,它应该可以解决您的问题:

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
System.out.println(creditAvailableProportion)              //Original value
DecimalFormat decimalFormat =  new DecimalFormat("#.##");
decimalFormat.setRoundingMode(RoundingMode.FLOOR);
String temp = decimalFormat.format(creditAvailableProportion);
System.out.println(temp);                                      //formatted string
float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));
System.out.println(formattedCreditAvailableProportion);         //Parsed float.

return Math.min(1.0f, formattedCreditAvailableProportion);

希望这会教你钓鱼。

答案 2 :(得分:0)

此外,您可以尝试Math.floor()。没有用,把它变成一个字符串,什么不是。

float temp = 7.888888f;
temp = temp * 100;
        temp = (float) Math.floor((double)temp);
        temp = temp /100;
        System.out.println(temp);