如何转换if-else开关语句

时间:2013-11-11 23:40:19

标签: java casting jgrasp

我想我需要投射此代码。我需要返回一个int,但我必须乘以百分数,不要让它们被切断 我应该像这样投brains = (double)brains - (this.getBrains() * 0.01);
我还应该在结尾处转换return语句吗?我在施法时很弱,而且我一直试图寻找帮助的例子,但他们没有帮助。

          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;
}

3 个答案:

答案 0 :(得分:1)

从double转换为int将始终截断,因此可能不完全是您所追求的。也就是说,(int)3.812会给你3,当你可能想要4时。

你也不需要强制转换为double,因为“int + int * double”会返回一个double。

最简单的方法是使用Math.round,它会将更大的值向上舍入。请注意,双打是长到一半,然后浮动到整数。

Floats几乎肯定能为您提供所需的精确度,因此最简单的解决方案是:

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

编辑:如果你确实想要双精度提供更高的精度,那么Math.round会给你一个长的,你需要把它转换成一个int:

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

请注意,常量已从0.01f更改为0.01d,从而更改整个计算的精度。

答案 1 :(得分:0)

假设你要减去第100个大脑。你可以用不同的方式做到这一点:

  • 总结:brains = brains - (this.getBrains() / 100);
  • 转到最近的大脑:brains = brains - (int)((double)this.getBrains() * 0.01 + 0.5);

当然,如果你愿意的话,第一种方法总是可以用铸造完成,而且我不确定两次铸造是否比整数除法更快或更慢。

由于attack是一个整数且返回值也是如此,因此您无需转换返回值。

答案 2 :(得分:0)

如果同一表达式中存在更大的数据类型,Java会自动提升较小的数据类型。如果你这样做:

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

您根本不需要显式转换为double,因为0.01是double,并且首先计算表达式的那部分(括号/乘法)。如果brains是一个int,则需要将表达式转换回int以进行赋值。这样做:

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

当然要确保你的整数不小(对于你正在进行的操作而言<100)。