Math.round 8/9应该是89而不是88

时间:2018-08-04 21:25:21

标签: java math

// 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));

1 个答案:

答案 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,以便将使用浮点而不是整数算术来计算表达式。

然后您可以摆脱试图舍入百分比的循环。