有人知道我在这里做错了吗?我有一个浮点数,比方说它是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);
提前致谢。
答案 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);