// Why does 0.888888889 round down to 88 instead of up to 89? I need the output in int format.
int[] percentage = new int[4];
percentage[0] = 100 * countB[0] / (10 - countDash[0]);
percentage[1] = 100 * countB[1] / (20 - countDash[1]);
percentage[2] = 100 * countB[2] / (20 - countDash[2]);
percentage[3] = 100 * countB[3] / (20 - countDash[3]);
for (int i = 0; i < countB.length; i++) {
double d = percentage[i];
percentage[i] = (int) Math.round(d);
}
System.out.println(Arrays.toString(percentage));
答案 0 :(得分:1)
要为您解决所有问题,这里会出现问题:
int[] percentage = new int[4];
percentage[0] = 100 * countB[0] / (10 - countDash[0]);
假设代码已编译,我们可以推断出所有变量的类型均为int[]
。
这意味着该表达式将使用32位整数算术求值。
这意味着该除法是整数除法。
但是在Java中,整数除法“向零舍入”。换句话说,它会截断结果。 (参考JLS 15.7.2)
所以800/9-> 88.88888889-> 88 NOT 89。
稍后再执行此操作
percentage[i] = (int) Math.round(d);
不幸的是,您这样做太晚了。当您进行原始(整数)除法时,就完成了“损坏”。
一种解决方案:使用浮点运算,然后进行四舍五入:
percentage[0] = (int) Math.round(100.0 * countB[0] / (10 - countDash[0]));
请注意,我们将100
更改为100.0
,以便将使用浮点而不是整数算术来计算表达式。
然后您可以摆脱试图舍入百分比的循环。