Java中的舍入问题。为什么在这种情况下我没有得到预期的结果?

时间:2019-05-26 18:03:30

标签: java rounding

我有一个为Minecraft制作的插件。它用于大规模的恶龙战斗,根据造成的伤害在所有人之间平均分配EXP。

它起作用了,但是有一个小问题使方程失去了体验。

代码如下:

private void divideExpAmongstPlayersBasedOnDamageDealt(int exp, Map<Player, Double> damageMap) {
    double totalDamageDealt = 0.0d;

    for (Double value : damageMap.values()) {
        totalDamageDealt += value;
    }

    while (exp > 0 && !damageMap.isEmpty()) {
        Player maxHitterInList = Collections.max(damageMap.entrySet(),
                Comparator.comparingDouble(Map.Entry::getValue)).getKey();

        double damageShare = damageMap.get(maxHitterInList) / totalDamageDealt;
        int expShare = (int) Math.round(exp * damageShare);

        if (expShare == 0)
            break;

        if (maxHitterInList.isOnline()) {
            sendPlayerMessage(maxHitterInList, damageShare, expShare);
            maxHitterInList.giveExp(expShare);
        }

        exp -= expShare;

        damageMap.remove(maxHitterInList);
    }
}

找到最大的击球手,奖励他们应占的EXP并将其从列表中删除,直到没有更多EXP可以提供为止。

问题是它遗漏了分数,迫使我在while条件中添加&& !damageMap.isEmpty()以避免出现异常。它始终准确地打印百分比(总和为100)。

我认为它与Math.round函数有关,尽管我不知道如何调试它。当我手动进行计算时,它们会计算出来。

示例(这确实发生了):暴民授予10 exp。玩家1造成57%伤害,玩家2造成43%。正确打印百分比值,但Player1收到6 EXP,而Player2收到2?我上次检查0.57 * 10等于5.7 = 6,而0.43 * 10等于4.3 = 4

我想念什么?它与舍入功能或加倍工作方式有关吗?

谢谢

1 个答案:

答案 0 :(得分:2)

这不是一个四舍五入的问题,但是您在计算中使用了错误的值。

您写了“上次我检查0.57 * 10等于5.7 = 6和0.43 * 10等于4.3 = 4” ,但是您使用的公式是

int expShare = (int) Math.round(exp * damageShare);

并且您为循环的每次迭代更新exp

exp -= expShare;

这意味着您的第二个玩家exp是4个而不是您在示例中假设的10个,因此实际计算是 0.43 * 2 ,四舍五入为2

因此,您需要将while条件中使用的变量和计算中使用的变量分开。