3

我很难弄清楚为什么像这样的简单除法总是返回 0。

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

我用 Ls 为所有数字添加了后缀,因此它们被视为 Longs。我一直得零。

我正在尝试计算 4091365376L 与 4091495462L 的百分比。我的价值观是多头,但我只是在寻找一个简单的整数值。

4

4 回答 4

7

您是整数舍入的受害者(实际上是截断)。试试这个:

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

打印99。或double隐式转换为:

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

给予99.99682057572328。您的问题是,在潜水它们时,结果4091495462L略大4091365376L,结果被截断为(如果您不相信,请0尝试)。3 / 40时代100是...

于 2012-06-18T18:55:56.390 回答
4
4091365376L / 4091495462L * 100L
\_______________________/       |
      0.99... = 0               |
      \_________________________/
                    0

你可以这样表达

100 * 4091365376L / 4091495462L

那么它会变成

100 * 4091365376L / 4091495462L
\_______________/              |
  409136537600L                |
  \____________________________/
          99.99... = 99  
于 2012-06-18T18:56:57.350 回答
-1

顺序很重要,类型也很重要。long 除以 long 的输出是 long。您执行的除法结果是 0,并且 0 * 100 == 0。使用这样的东西会更好:

System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
于 2012-06-18T18:57:32.397 回答
-1

在整数数学中:

4091365376 / 4091495462 = 0
0 * 100 = 0

你在期待

4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327

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

于 2012-06-18T18:59:02.080 回答