我遇到一个问题,就是不明白为什么这个简单的除法总是返回0。
System.out.println(4091365376L / 4091495462L * 100L);
我在所有数字后面加上了L,以便将它们视为长整型。但我总是得到一个零。
我正在尝试计算 4091365376L 到 4091495462L 的百分比。我的值是长整型,但我只需要一个简单的整数值。
我遇到一个问题,就是不明白为什么这个简单的除法总是返回0。
System.out.println(4091365376L / 4091495462L * 100L);
我在所有数字后面加上了L,以便将它们视为长整型。但我总是得到一个零。
我正在尝试计算 4091365376L 到 4091495462L 的百分比。我的值是长整型,但我只需要一个简单的整数值。
System.out.println(4091365376L * 100L / 4091495462L);
打印 99
。或者隐式地将其转换为 double
:
System.out.println(100.0 * 4091365376L / 4091495462L);
给出 99.99682057572328
。您的问题在于 4091495462L
稍微比 4091365376L
大,因此当将它们相除时,结果被截断为 0
(如果您不相信,请尝试 3 / 4
)。而 0
乘以 100
是...
4091365376L / 4091495462L * 100L
\_______________________/ |
0.99... = 0 |
\_________________________/
0
您可以这样表达:
100 * 4091365376L / 4091495462L
100 * 4091365376L / 4091495462L
\_______________/ |
409136537600L |
\____________________________/
99.99... = 99
顺序和类型都很重要。长整型除以长整型的输出是长整型。你正在执行的除法的结果是0,而0 * 100 == 0。最好使用类似以下代码:
System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
在整数运算中:
4091365376 / 4091495462 = 0
0 * 100 = 0
你期望着
4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327
但是你不能使用整数(或长整数)来实现这一点。如果您想要一个双精度值,请使用双精度浮点数。