Java 如何强制转换if-else开关语句

Java 如何强制转换if-else开关语句,java,casting,jgrasp,Java,Casting,Jgrasp,我想我需要施展这个密码。我需要返回一个整数,但我必须乘以百分比,并且不希望它们被截断。 我是否应该像这样投射它brains=(double)brains-(this.getBrains()*0.01) 我还应该在结尾处抛出return语句吗?我在铸造方面很弱,我一直在努力寻找有帮助的例子,但他们没有帮助。 假设你想减去大脑的百分之一。您可以通过不同的方式来实现这一点: 四舍五入:brains=brains-(this.getBrains()/100) 四舍五入到最近的大脑:brains=b

我想我需要施展这个密码。我需要返回一个整数,但我必须乘以百分比,并且不希望它们被截断。
我是否应该像这样投射它
brains=(double)brains-(this.getBrains()*0.01)

我还应该在结尾处抛出return语句吗?我在铸造方面很弱,我一直在努力寻找有帮助的例子,但他们没有帮助。


假设你想减去大脑的百分之一。您可以通过不同的方式来实现这一点:

  • 四舍五入:
    brains=brains-(this.getBrains()/100)
  • 四舍五入到最近的大脑:
    brains=brains-(int)((double)this.getBrains()*0.01+0.5)
当然,如果你愿意的话,第一种方法总是可以通过施法完成的,我不确定两次施法是比整数除法快还是慢


由于
attack
是一个整数,返回值也是,因此不需要强制转换返回值。

假设要减去大脑的第100个值。您可以通过不同的方式来实现这一点:

  • 四舍五入:
    brains=brains-(this.getBrains()/100)
  • 四舍五入到最近的大脑:
    brains=brains-(int)((double)this.getBrains()*0.01+0.5)
当然,如果你愿意的话,第一种方法总是可以通过施法完成的,我不确定两次施法是比整数除法快还是慢


由于
attack
是一个整数,并且返回值也是整数,因此不需要强制转换返回值。

从double强制转换为int将始终截断,因此可能不完全是您想要的。也就是说,(int)3.812将为您提供3,而您可能需要4

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

最简单的方法是使用Math.round,它将对较大的值进行四舍五入。请注意,双倍循环为长循环,浮动循环为整数循环

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

brains = Math.round(brains - this.getBrains() * 0.01f);
编辑:如果您确实希望双精度提供更高的精度,那么Math.round将为您提供一个long,您需要将其转换为int:

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

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

从double转换为int将始终截断,因此可能不是您想要的。也就是说,(int)3.812将为您提供3,而您可能需要4

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

最简单的方法是使用Math.round,它将对较大的值进行四舍五入。请注意,双倍循环为长循环,浮动循环为整数循环

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

brains = Math.round(brains - this.getBrains() * 0.01f);
编辑:如果您确实希望双精度提供更高的精度,那么Math.round将为您提供一个long,您需要将其转换为int:

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

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

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

brains = brains + (other.getBrains() * 0.01);
您根本不需要显式强制转换为double,因为0.01是double,表达式的该部分首先求值(括号/乘法)。如果
brains
是int,则需要将表达式转换回int以进行赋值。这样做:

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

当然,还要确保整数不小(<100)如果同一表达式中有较大的数据类型,Java会自动升级较小的数据类型。如果您这样做:

brains = brains + (other.getBrains() * 0.01);
您根本不需要显式强制转换为double,因为0.01是double,表达式的该部分首先求值(括号/乘法)。如果
brains
是int,则需要将表达式转换回int以进行赋值。这样做:

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

当然,还要确保你的整数不小(你正在做的运算小于100)。

什么类型的大脑是
攻击
?整数?brains是一个实例变量,attack是一个局部变量我只需要它来返回一个整数,但当我不进行任何强制转换时,我得到了一个错误:可能会失去精度,所以看到这一点,我假设我需要强制转换只是出于好奇,为什么你要在
else
语句中打开武器,然后在每个
案例中做完全相同的事情
?@StriplingWarrior对这个问题的概括描述是:如果攻击的僵尸的级别等于或高于被攻击的僵尸,那么攻击的僵尸会获得大脑,而被攻击的僵尸会失去大脑。如果攻击僵尸的级别低于另一个僵尸,则转移以相反的方式发生(即,另一个僵尸获得大脑,而攻击僵尸失去大脑)。该方法应返回攻击僵尸获得(将是正数)或丢失(作为负数)的大脑数量。什么类型的大脑是
大脑和
攻击
?整数?brains是一个实例变量,attack是一个局部变量我只需要它来返回一个整数,但当我不进行任何强制转换时,我得到了一个错误:可能会失去精度,所以看到这一点,我假设我需要强制转换只是出于好奇,为什么你要在
else
语句中打开武器,然后在每个
案例中做完全相同的事情
?@StriplingWarrior对这个问题的概括描述是:如果攻击的僵尸的级别等于或高于被攻击的僵尸,那么攻击的僵尸会获得大脑,而被攻击的僵尸会失去大脑。它是正在攻击的僵尸