Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Math.pow(x,y)算作双精度?_Java_Int_Double_Pow - Fatal编程技术网

Java 为什么Math.pow(x,y)算作双精度?

Java 为什么Math.pow(x,y)算作双精度?,java,int,double,pow,Java,Int,Double,Pow,我正在编写一个Java程序来计算在我的《歌唱的怪物》中,一个怪物达到一定水平需要多少食物。当我运行程序时,它说,“不能从double转换为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

我正在编写一个Java程序来计算在我的《歌唱的怪物》中,一个怪物达到一定水平需要多少食物。当我运行程序时,它说,“不能从double转换为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.");
}

您必须这样做:

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

正如您在中所看到的,
Math.pow()
通过设计返回一个
double
,但是如果您需要
int
,则必须执行显式强制转换。

Math.pow返回double,并且您将double值指定给int,这就是它给出错误的原因。你必须放下它。像

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

我认为在大多数现代处理器上,通常硬件支持浮点幂运算,但不支持整数运算。正因为如此,对于一般的幂,实际上用
double
进行
Math.power
运算,然后将其转换回
int
会更快

然而,在这种情况下,有一种更快的方法来实现ints。由于您使用的是2的幂,因此可以使用:


javadoc。显示错误时,突出显示“int-levelmein=5*(Math.pow(2,level-1));”的行。@JasonChen pow返回什么数据类型?您试图将其分配给哪种类型的值?当您回答这些问题时,答案将是显而易见的。我是否应该将levelMein转换为double?错误本身就说明了问题。
5@Rhymoid-这就是我在回答中提到的。然而,我忽略了一个事实,那就是我可以直接移动5,而不是在之后进行乘法运算。我会更新我的答案。谢谢,我不知道。只是
5
int levelMeal = 5*(1<<(level-1));
int levelMeal = 5<<(level-1);