这段代码给出了我想要的结果
double a=Math.random()*100;
int b=(int)a;
System.out.println(b);
但是当我用这种方式做同样的事情时,总是给出零
int a=(int)Math.random()*100;
System.out.println(a);
据我所知,类型转换会将较大的数据类型存储为较小的数据类型。但是在后面的代码中,每次运行程序时我都会得到零。
答案 0 :(得分:5)
(int)Math.random()*100;
表示:
投射' Math.random()'的值由于Math.random返回0到1之间的数字,因此转换为int将始终切断小数路径并给出0。
正确的方法是
(int)(Math.random()*100);
答案 1 :(得分:2)
试试,
int a=(int)(Math.random()*100);
System.out.println(a);
Math.random()
返回带有正号的double值,大于或等于0.0且小于1.0。返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。
答案 2 :(得分:2)
类型转换是从右到左关联的,并且优先级高于乘法。
让我分解一下。
与任何其他运算符一样,类型转换具有一定的优先级附加到它。某些运营商具有比其他运营商更高的优先级,并且某些运营商以某种方式与其参数相关联。例如,数值运算通常是从左到右的关联;也就是说,对于具有相同优先级的运算符,可以从左侧对它们进行括号化并获得相同的结果。
示例:
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
(这完全是多余的,但可能)。
特别是优先级位是导致乘法在此事件链中应用 last 的原因。
请记住,在任何级别的优先级中语言都没有相关性。这意味着1级优先级的运营商以特定方式关联,2级运营商以特定方式运营
所以,我们现在来看你的表达:
int a = (int) Math.random() * 100;
Casting的优先级为3.数学运算符*的优先级为4.因此,Java会看到你的语句:
int a = ((int) Math.random()) * 100;
圆括号是为了更清晰。 (请注意,括号的优先级最高。)
您想要做的事情,正如在其他答案中更简洁地解释的那样,使用括号强制您的预期优先级,而不是让Java决定。所以,你会写这个:
int a = (int) (Math.random() * 100);
这迫使Java在演员表之前评估乘法,因为括号的优先级高于演员表。
答案 3 :(得分:1)
因为投放到int
会在乘法之前发生,而Math.random()
会生成0
(包含)和1
之间的数字(不包括),它会四舍五入为{ {1}}。
答案 4 :(得分:1)
你在这里相乘前进行投射......
Math.random()
将生成介于0和1之间的数字,并在乘以100之前舍入为0.
(int)(Math.random()*100)
会按您的意愿行事。
答案 5 :(得分:1)
考虑使用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)
答案 6 :(得分:0)
使用它:
int a=(int)(Math.random()*100);
System.out.println(a);