web-dev-qa-db-ja.com

Math.pow(x、y)がDoubleとして数えるのはなぜですか?

私は、Javaプログラムを書いて、モンスターを私の歌うモンスターの特定のレベルに到達させるのにどれだけの食物が必要かを計算します。プログラムを実行すると、「から変換できませんdouble to int "。誰かがこれがなぜかを説明できますか?これがプログラムです。

int totalFood = 0;
int level = 1;
int levelMeal = 5*(Math.pow(2,level-1));
int mealNumber = 1;
int levelGoal = 1;
while(level != levelGoal)
{
  if(mealNumber != 5)
  {
    mealNumber += 1;
    totalFood += levelMeal;
  }
  else if(mealNumber == 5)
  {
    mealNumber = 0;
    level += 1;
  }
}
if(level == levelGoal)
{
  println("The total amount of food required for a monster to reach level " + levelGoal + " is " + totalFood + " food.");
}
13
Jason Chen

これを行う必要があります:

_int levelMeal = (int) (5*(Math.pow(2,level-1)));
                  ^
           this is a cast
_

documentation を見るとわかるように、Math.pow()は仕様によりdoubleを返しますが、intが必要な場合は、明示的なキャストを行う必要があります実行されました。

16
Óscar López

ほとんどの最新のプロセッサでは、浮動小数点のべき乗を実行するためにハードウェアがサポートされていますが、整数はサポートされていません。そのため、generalパワーの場合、Math.powerdoubleで実行してから変換する方が実際には高速です。 intに。

ただし、この場合は、intに対してそれを行うためのより速い方法があります。 2の累乗を実行しているため、代わりに ビット単位の左シフト演算子 を使用できます。

int levelMeal = 5*(1<<(level-1));

Rhymoidがコメントで指摘したように、その式は1を削除するためにさらに簡略化できます。

int levelMeal = 5<<(level-1);
3
DaoWen

Math.powはdoubleを返し、intにdouble値を割り当てると、エラーが発生します。あなたはそれをダウンキャストする必要があります。お気に入り

int levelMeal = (int)5*(Math.pow(2,level-1));
0
niiraj874u