有人知道我做错了什么吗?我得到了一个浮点数,假设它是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);提前谢谢。
发布于 2016-08-18 13:01:37
由于没有人解释这个问题,让我简要地解释一下发生了什么。在包括java在内的大多数系统中,浮点数都不是精确的。这意味着.04在内部被存储为例如.03999999999或.040000001或类似的东西。因此,当您使用floor格式对其进行格式化时,您可能最终会得到.03。解决方案是使用四舍五入格式,或者在格式之前将.0000001添加到值中。那样的话,即使是floor也会做对。
另一种方法是,如果可能的话,完全丢弃浮点数,并使用整数(如1e6),类似于Android对地理坐标的处理。
发布于 2016-08-18 10:51:57
如何调试:
运行这段代码,它应该会让你的问题变得清晰:
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);希望这篇文章能教会你如何钓鱼。
发布于 2016-08-18 11:01:50
此外,您还可以尝试使用Math.floor()。把它变成一个字符串或者其他什么都没有用。
float temp = 7.888888f;
temp = temp * 100;
temp = (float) Math.floor((double)temp);
temp = temp /100;
System.out.println(temp);https://stackoverflow.com/questions/39009074
复制相似问题