2013-11-11 5 views
1

Мне кажется, что мне нужно сделать этот код. Мне нужно вернуть int, но я должен умножить на проценты и не хочу, чтобы они были отрезаны.
Должен ли я лить его вот так: brains = (double)brains - (this.getBrains() * 0.01);
Также следует ли использовать оператор возврата в конце? Я слаб при кастинге, и я пытался найти примеры, чтобы помочь, но они не помогают.
Как отличить оператор switch if-else

  if(attacker >= attackee) 
      { 
      switch (weapon) 
       { 
        case 't': 
         brains = brains + (other.getBrains() * 0.01); 
         attack = other.getBrains() * -0.01; 
         other.addBrains(attack); 
         break; 

        case 's': 
         brains = brains + (other.getBrains() * 0.05); 
         attack = other.getBrains() * -0.05; 
         other.addBrains(attack); 
         break; 

        case 'c': 
         brains = brains + (other.getBrains() * 0.10); 
         attack = other.getBrains() * -0.10; 
         other.addBrains(attack); 
         break; 

        case 'k': 
         brains = brains + (other.getBrains() * 0.20); 
         attack = other.getBrains() * -0.20; 
         other.addBrains(attack); 
         break; 
       } 
     } 
     else 
      { 
       switch (weapon) 
       { 
        case 't': 
         brains = brains - (this.getBrains() * 0.01); 
         attack = this.getBrains() * 0.01; 
         other.addBrains(attack); 
         break; 

        case 's': 
         brains = brains - (this.getBrains() * 0.01); 
         attack = this.getBrains() * 0.01; 
         other.addBrains(attack); 
         break; 

        case 'c': 
         brains = brains - (this.getBrains() * 0.01); 
         attack = this.getBrains() * 0.01; 
         other.addBrains(attack); 
         break; 

        case 'k': 
         brains = brains - (this.getBrains() * 0.01); 
         attack = this.getBrains() * 0.01; 
         other.addBrains(attack); 
         break;  
       } 
      }     
    return attack; 
} 
+0

Какой тип «мозги» и «атака»? Целые? – MasterOfBinary

+0

их оба целых числа – JessNicole27

+0

мозги - это переменная экземпляра, а атака - это локальная переменная – JessNicole27

ответ

0

Предположим, вы хотите, чтобы вычесть сотых мозгов. Вы можете сделать это по-разному:

  • Округлите: brains = brains - (this.getBrains()/100);
  • Округление до ближайшего мозга: brains = brains - (int)((double)this.getBrains() * 0.01 + 0.5);

Конечно, первый способ всегда может быть сделано с литьем, если вы хотите вроде, и я не уверен, что листинг дважды быстрее или медленнее, чем целочисленное деление.

Поскольку attack является целым числом, а возвращаемое значение равно, вам не нужно указывать возвращаемое значение.

1

Кастинг от double до int всегда будет усекать, так что может быть не совсем то, что вам нужно. То есть, (int) 3.812 даст вам 3, когда вы, вероятно, захотите 4.

Вам не нужно делать двойные, так как «int + int * double» вернет двойной.

Самый простой способ - использовать Math.round, который будет охватывать более крупные значения. Имейте в виду, что удваивается до длинного, и, несмотря на это, плавает вокруг.

поплавков почти наверняка даст вам точность вы после этого, поэтому самое простое решение для Вас:

brains = Math.round(brains - this.getBrains() * 0.01f); 

Edit: если вы хотите более высокую точность, обеспечиваемую удваивается, а затем Math. тур даст вам долго, что вам нужно, чтобы бросить к междунар:

brains = (int)Math.round(brains - this.getBrains() * 0.01d); 

Обратите внимание, что константа изменилась от 0.01f к 0.01d изменения точности всего расчета.

+0

Я не уверен, что использование поплавка здесь - хорошая идея. Двойной может соответствовать всему диапазону int, поэтому точность при литье 'int -> double -> int' не теряется. Не так для float, если число достаточно велико, то кастинг на float фактически потеряет точность. – Radiodef

+0

Учитывая проблемную область, полагая, что вопросник не является мозговым хирургом, я предполагаю, что точность не так важна. Будет обновлен мой ответ, чтобы включить решение с более высокой точностью. – Martin

+0

Наверное, не имеет значения, правда, что точность может быть фактически потеряна. Простой тест: 'for (float i = 0f; i <= 65f; i + = 1f) System.out.println ((int) (Integer.MAX_VALUE - i)); – Radiodef

0

Java автоматически способствует уменьшению типов данных, если в одном выражении имеется больший тип данных. Если вы сделаете это:

brains = brains + (other.getBrains() * 0.01); 

Вам не нужно явно приводить к двойному вообще, потому что 0,01 двойная и что часть выражения вычисляется первое (скобки/умножение). Если brains - это int, вам нужно будет отнести выражение к int для выполнения задания. Делают это так:

brains = (int)Math.rint(brains + (other.getBrains() * 0.01)); 

И, конечно, убедитесь, что целые числа не малы (< 100 для операций, которые вы делаете).

Смежные вопросы