【问题标题】:Why Does Math.pow(x,y) Count as a Double?为什么 Math.pow(x,y) 算作双精度数?
【发布时间】:2014-04-28 02:16:47
【问题描述】:

我正在编写一个 Java 程序来计算在 My Singing Monsters 中让怪物达到一定水平需要多少食物。当我运行程序时,它说“无法从 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.");
}

【问题讨论】:

  • Here's javadoc.
  • 显示错误时,显示“int levelMeal = 5*(Math.pow(2,level-1));”的行突出显示。
  • @JasonChen pow 返回什么数据类型?您要分配给什么类型的值?当你回答这些问题时,答案就显而易见了。
  • 我应该将 levelMeal 转换为 double 吗?
  • 错误确实不言自明。

标签: java int double pow


【解决方案1】:

你必须这样做:

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

正如您在 documentation 中看到的那样,Math.pow() 在设计上返回 double,但如果您需要 int,则必须执行显式转换。

【讨论】:

  • 5<<(level-1) 将是一个更合适的实现(如果您修复了通过 double 获得的相同溢出问题),并且对于非常高的 levels 将更精确(如果您愿意使用long 甚至是bignum 类型而不是int)。
  • @Rhymoid - 这就是我的回答。但是,我忽略了一个事实,即我可以直接移动 5 而不是之后进行乘法运算。我会更新我的答案。
【解决方案2】:

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

但是,在这种情况下,对于 int,有一种更快的方法。由于您使用的是 2 的幂,因此您可以改用 bitwise left-shift operator

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

正如 Rhymoid 在他的评论中指出的那样,该表达式可以进一步简化以删除 1

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

【讨论】:

  • 谢谢,我不知道。
  • 只要5&lt;&lt;(level-1) 也可以。我怀疑 javac 是否足够聪明,无法自行进行优化。
【解决方案3】:

Math.pow 返回 double 并且您将 double 值分配给 int 这就是它给出错误的原因。你必须沮丧。喜欢

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

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多