我无法弄清楚为什么像这样的简单分区总是返回0。
System.out.println(4091365376L / 4091495462L * 100L);
我用Ls后缀所有数字,以便将它们视为Longs。我一直都是零。
我试图计算4091365376L到4091495462L的百分比。我的值是Longs,但我只是在寻找一个简单的Integer值。
答案 0 :(得分:7)
您是整数舍入的受害者(实际上是:截断)。试试这个:
System.out.println(4091365376L * 100L / 4091495462L);
打印99
。或隐式转换为double
:
System.out.println(100.0 * 4091365376L / 4091495462L);
给予99.99682057572328
。您的问题是4091495462L
略大于4091365376L
所以当潜水时,结果会被截断为0
(如果您不相信,请尝试3 / 4
)。和0
次100
是......
答案 1 :(得分:4)
4091365376L / 4091495462L * 100L
\_______________________/ |
0.99... = 0 |
\_________________________/
0
你可以像
那样表达100 * 4091365376L / 4091495462L
然后它会变成
100 * 4091365376L / 4091495462L
\_______________/ |
409136537600L |
\____________________________/
99.99... = 99
答案 2 :(得分:-1)
顺序很重要,类型也是如此。长除以长的输出是长的。你正在执行的除法的结果是0,而0 * 100 == 0.使用这样的东西你会好得多:
System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
答案 3 :(得分:-1)
在整数数学中:
4091365376 / 4091495462 = 0
0 * 100 = 0
你期待
4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327
但你不能用整数(或长整数)来做。如果你想要一个双倍值,请使用双打。