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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (19)

我有一个我为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给予。

问题是它错过了点,迫使我添加&& !damageMap.isEmpty()while条件以避免异常。它总是准确地打印百分比(总和加起来为100)。

我认为它与Math.round函数有关,虽然我在黑暗中如何调试它。当我手工计算时,他们就可以解决了。

示例(这确实发生了):暴民授予10exp。PLAYER1没有57%伤害,Player2做43%。百分比值得到正确打印,但6Player1接收EXP并且Player2接收2?? 上次我检查了0.57 * 10等于5.7 = 60.43 * 10等于4.3 = 4

我错过了什么?是否与圆形功能或双打工作方式有关?

谢谢

提问于
用户回答回答于

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

你写道“上次我检查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与计算中使用的变量分开。

扫码关注云+社区

领取腾讯云代金券