【问题标题】:logic error? diving 2 int that result in a float逻辑错误?潜水 2 int 导致浮点数
【发布时间】:2017-06-23 00:55:38
【问题描述】:

我正在编写一个战斗模拟器。我的攻击者类发起攻击,而我的防御者类应该阻止它。 manager 是我计算和打印结果的主要课程。我的问题在于我的 highRatio、mediumRatio 和 lowRatio 变量。如果它们不等于 1,则它们都设置为零。关于可能会发生什么的任何想法?

//防御者类

public int defenseSelector(int highAtkCounter, int mediumAtkCounter, int lowAtkCounter, int rounds, int roundCounter)
{
    Random defenseTypeGenerator;
    int defense = 0;
    float highRatio;
    float mediumRatio;
    float lowRatio;

    defenseTypeGenerator = new Random();
    int defenseType = defenseTypeGenerator.nextInt(MAX_ROUNDS) + 1;

    highRatio = highAtkCounter/roundCounter;
    mediumRatio = mediumAtkCounter/roundCounter;
    lowRatio = lowAtkCounter/roundCounter;



   if(roundCounter > 3 && roundCounter <= rounds) //AI portion
   {
       if (highRatio > mediumRatio && highRatio > lowRatio)
       {
            defense = HIGH;
       }

       else if (mediumRatio > highRatio && mediumRatio > lowRatio)
       {
            defense = MEDIUM;
       }

       else if (lowRatio > highRatio && lowRatio > mediumRatio)
       {
            defense = LOW;
       }

       else
       {
            System.out.println("AI ERROR ratios " + highRatio + " " + mediumRatio + " " + lowRatio);
            System.out.println("AI ERROR atkCounters " + highAtkCounter + " " + mediumAtkCounter + " " + lowAtkCounter);
            System.out.println("AI ERROR rCounters " + roundCounter);

//管理类

while(roundCounter <= rounds)
    {
        int attack = theAttacker.attackSelector(high, medium, low);

        int highAtkTracker = theAttacker.countHighAtks(attack);
        System.out.println("DEBUG " + attack);
        System.out.println("DEBUG " + highAtkTracker);
        int mediumAtkTracker = theAttacker.countMediumAtks(attack);
        System.out.println("DEBUG " + attack);
        System.out.println("DEBUG " + mediumAtkTracker);
        int lowAtkTracker = theAttacker.countLowAtks(attack);
        System.out.println("DEBUG " + attack);
        System.out.println("DEBUG " + lowAtkTracker);

        highAtkCounter = highAtkCounter + highAtkTracker;
        mediumAtkCounter = mediumAtkCounter + mediumAtkTracker;
        lowAtkCounter = lowAtkCounter + lowAtkTracker;


        int defense = theDefender.defenseSelector(highAtkCounter, mediumAtkCounter, lowAtkCounter, rounds, roundCounter);

【问题讨论】:

    标签: java floating-point precision floating-accuracy


    【解决方案1】:

    在java中,任何带有整数的算术运算都会产生一个整数。

    因此,您必须将整数显式转换为浮点类型:

        highAtkCounter = highAtkCounter + (float)highAtkTracker;
        mediumAtkCounter = mediumAtkCounter + (float)mediumAtkTracker;
        lowAtkCounter = lowAtkCounter + (float)lowAtkTracker;
    

    【讨论】:

    • 谢谢!!!而不是编辑你建议的行,我编辑了防守者类中的那些:highRatio = (float)highAtkCounter/roundCounter; mediumRatio = (float)mediumAtkCounter/roundCounter; lowRatio = (float)lowAtkCounter/roundCounter;
    • @KhalidJomha “而不是编辑你建议的行,我编辑了防御者类中的那些” 你的代码,你的选择......;o)但请记住浮点运算可能存在数字化错误。通常这在艰难的游戏中并不重要......
    • @KhalidJomha:请写下0.1完全准确二进制表示
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2012-10-21
    相关资源
    最近更新 更多