我是java新手,我想这样做:
System.out.println(1 / 20 * 1000);
应该输出50,但由于某种原因它输出0。
我通过输入
修复了它System.out.println((int) (1F / 20F * 1000F));
(我知道你不需要int cast,但我只想知道它是否有效)
为什么Java会给我这个奇怪的结果?
答案 0 :(得分:2)
因为Java正在执行integer division(JLS 15.17),其中1 / 20
为0,小数部分被丢弃。
指定1F
是float
字面值。在这种情况下,Java将按预期执行除法。
答案 1 :(得分:1)
让我们分解吧。你的代码有点像这样:
int tmp1 = 1 / 20;
int tmp2 = tmp1 * 1000;
System.out.println(tmp2);
现在请记住,当两个操作数都是整数时,操作将使用整数算法执行。这意味着tmp1
将为0 ...这意味着tmp2
将为0。
您的第二个版本相当于:
float tmp1 = 1F / 20F; // Both values are of type "float" here
float tmp2 = tmp1 * 1000F;
int tmp3 = (int) tmp2;
System.out.println(tmp3);
现在tmp1
大致 0.05,tmp2
大致 50,而tmp3
是50.值得注意由于浮点运算的变幻莫测,我不会非常惊讶地得到49的值 - tmp1
不能正好 0.05,因为它不能表示为float
。
一般来说,如果一个大的陈述没有达到预期的效果,那么值得将其分解为较小的陈述 - 这样可以让您更容易地逐步调试它。
答案 2 :(得分:0)
分割时有2个整数值
int / int
你只得到int类型的结果 - 点之前的数字