打印Long类型的除法和乘法运算结果出现问题

3

我遇到一个问题,就是不明白为什么这个简单的除法总是返回0。

System.out.println(4091365376L / 4091495462L * 100L);

我在所有数字后面加上了L,以便将它们视为长整型。但我总是得到一个零。

我正在尝试计算 4091365376L 到 4091495462L 的百分比。我的值是长整型,但我只需要一个简单的整数值。


我已经有一段时间没有用Java了,但我认为你需要使用%字符来返回“mod”。 - BillyNair
4个回答

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 是...


4
4091365376L / 4091495462L * 100L
\_______________________/       |
      0.99... = 0               |
      \_________________________/
                    0

你可以这样表达:

您可以这样表达:

100 * 4091365376L / 4091495462L

如果这样的话,它将会变成:
100 * 4091365376L / 4091495462L
\_______________/              |
  409136537600L                |
  \____________________________/
          99.99... = 99  

我喜欢ASCII图表。在这些情况下,它确实使事情变得容易。谢谢。 - Mridang Agarwalla

-1

顺序和类型都很重要。长整型除以长整型的输出是长整型。你正在执行的除法的结果是0,而0 * 100 == 0。最好使用类似以下代码:

System.out.println((long) (4091365376.0 / 4091495462.0 * 100));

-1

在整数运算中:

4091365376 / 4091495462 = 0
0 * 100 = 0

你期望着

4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327

但是你不能使用整数(或长整数)来实现这一点。如果您想要一个双精度值,请使用双精度浮点数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接