Why Does Math.pow(x,y) Count as a Double?

2020-02-10 03:36发布

I'm writing a Java program to calculate how much food it will take to get a monster to a certain level in My Singing Monsters. When I run the program, it says, "cannot convert from double to int". Can someone explain why this is? Here's the program.

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.");
}

3条回答
戒情不戒烟
2楼-- · 2020-02-10 04:11

Math.pow return double and you assigning double value to int this is why it is giving error. You have to downcast it. Like

int levelMeal = (int)5*(Math.pow(2,level-1));
查看更多
做个烂人
3楼-- · 2020-02-10 04:18

You'll have to do this:

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

As you can see in the documentation, Math.pow() returns a double by design, but if you need an int then an explicit cast must be performed.

查看更多
贼婆χ
4楼-- · 2020-02-10 04:34

I think there's typically hardware support on most modern processors for doing floating-point powers, but not integers. Because of that, for a general power, it's actually faster to do Math.power with a double and then convert it back to an int.

However, in this case there's a faster way to do it for ints. Since you're doing a power of 2, you can just use the bitwise left-shift operator instead:

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

As Rhymoid pointed out in his comment, that expression can be further simplified to remove the 1:

int levelMeal = 5<<(level-1);
查看更多
登录 后发表回答