【问题标题】:Cast problems between int and double [duplicate]int和double之间的转换问题[重复]
【发布时间】:2023-03-14 10:47:01
【问题描述】:

这段代码给出了我想要的结果

double a=Math.random()*100;
int b=(int)a;
System.out.println(b);

但是当我以这种方式做同样的事情时,它总是给零

int a=(int)Math.random()*100;
System.out.println(a);

据我所知,类型转换会将较大的数据类型存储为较小的。但在后面的代码中,我每次运行程序时都会得到零。

【问题讨论】:

  • (int)(Math.random()*100) 会按照你的意愿行事......
  • 了解 random 的返回值将帮助您解决这个问题。
  • 类型转换在乘法之前,math.random 产生 0-1 之间的数字,因此将其四舍五入为 0,因此乘法得到 0
  • (int)Math.random()*100; === ((int)Math.random())*100;
  • 为什么人们评论而不是写一个正确的答案?对于未来的访问者,评论不可能被标记为“正确”。

标签: java type-conversion


【解决方案1】:

(int)Math.random()*100; 表示:

将 'Math.random()' 的值转换为 int,然后乘以 100。由于 Math.random 返回一个介于 0 和 1 之间的数字,因此转换为 int 将始终切断小数路径并给您 0。

正确的做法是

(int)(Math.random()*100);

【讨论】:

    【解决方案2】:

    试试看,

    int a=(int)(Math.random()*100);
    System.out.println(a);
    

    Math.random() 返回一个带正号的双精度值,大于等于 0.0 且小于 1.0。返回值是伪随机选择的,从该范围(近似)均匀分布。

    【讨论】:

      【解决方案3】:

      类型转换是从右到左结合的,并且比乘法具有更高的优先级。

      Source

      让我分解一下。

      与任何其他运算符一样,类型转换具有一定的优先级。某些运算符比其他运算符具有更高的优先级,并且某些运算符以某种方式与它们的参数相关联。例如,数值运算通常是从左到右的关联;也就是说,对于具有相同优先级的运算符,可以从左括号将它们括起来并得到相同的结果。

      例子:

      5 * 5 * 5 / 3 + 5 -> (((5) * 5) * 5) / 3) + 5
      

      从右到左的关联性将允许您将右侧的操作用括号括起来以实现相同的结果。

      例子:

      int x;
      int y;
      int z;
      x = y = z = 10 -> x = (y = (z = (10))
      

      类型转换,很像赋值,是从右到左的关联,所以它本质上会使用最右边的参数来满足其最接近的关联,然后在链中向后推进,直到达到最终目标。

      这意味着你可以把它写成有效的语法,虽然它会非常奇怪:

      Object foo = (Object)(Number)(float)Math.random();
      

      首先,我们将结果从 double 转换为 float,然后转换为 Number,然后转换为 Object(这完全是多余的,但可能)。

      特别是优先级位是导致在此事件链中最后应用乘法的原因。

      请记住,语言不会在任何一个优先级中混合关联性。这意味着优先级 1 的运算符以特定方式关联,而优先级 2 的运算符以特定方式运行.

      所以,我们现在来看看你的表达方式:

      int a = (int) Math.random() * 100;
      

      强制转换的优先级为 3。数学运算符 * 的优先级为 4。因此,Java 看到您的语句如下:

      int a = ((int) Math.random()) * 100;
      

      括号是为了更加清晰。 (注意括号的优先级最高。)

      正如其他答案中更简洁地解释的那样,您想要做的是使用括号强制您的预期优先级,而不是让 Java 决定。所以,你可以这样写:

      int a = (int) (Math.random() * 100);
      

      这会强制 Java 在强制转换之前计算乘法,因为括号的优先级高于强制转换。

      【讨论】:

        【解决方案4】:

        因为转换为int 发生在乘法之前,并且Math.random() 生成一个介于0(包括)和1(不包括)之间的数字,所以它被四舍五入为0

        【讨论】:

        • 哦,谢谢!!!确实是一个真正快速的答复。我现在这样做了 int a=(int)(Math.random()*100);并且工作正常。
        • @PushpendraYadav 如果您发现其中一个答案是正确的,请不要忘记打勾。
        【解决方案5】:

        您在此处进行乘法运算... Math.random() 将生成 0 到 1 之间的数字,并在乘以 100 之前舍入为 0。

        (int)(Math.random()*100) 将按照您的意愿行事。

        【讨论】:

          【解决方案6】:

          考虑使用java.util.Random

          Random random = new Random();
          int value = random.nextInt(100);
          System.out.println(value);
          
          • Random 是线程安全的,而 Math.Random() 不是。
          • 测试时,您可以向Random 提供相同的种子,以生成可重现的伪随机数。你不能用Math.Random()
          • 等等。

          在此处查看更多信息:Math.random() versus Random.nextInt(int)

          【讨论】:

            【解决方案7】:

            使用这个:

            int a=(int)(Math.random()*100);
            System.out.println(a);
            

            【讨论】:

              猜你喜欢
              • 2011-02-23
              • 2015-04-24
              • 1970-01-01
              • 1970-01-01
              • 2019-06-21
              • 1970-01-01
              • 2015-07-14
              • 2012-09-03
              • 1970-01-01
              相关资源
              最近更新 更多