将长整数除以长整数得到的结果是0

40
我正在尝试计算Windows中已用磁盘空间的百分比,其中totaldrive表示C驱动器上的总磁盘空间(以Long类型表示),而freedrive表示剩余空间(也是以Long类型表示)。
 long totaloccupied = totaldrive - freedrive;

这里计算使用率的百分比

 Long Percentageused =(totaloccupied/totaldrive*100);
 System.out.println(Percentageused);

打印语句返回0。由于我没有得到预期的值,有人能帮忙吗?


7
嘿。那是一天很长,我享受了在河里漂流的时光... - cabbagery
2
为什么你使用 Long 而不是 long?另外,请查看 Java 命名规范中的 percentageUsed - wchargin
3个回答

67

你可能正在执行长整型除以长整型的操作,这是 (long/long = long) 的运算方式,结果为长整型(在您的情况下为0)。

您可以将除法中任何一个操作数转换为浮点类型,从而实现相同的效果。

Long Percentageused = (long)((float)totaloccupied/totaldrive*100);

7

您正在执行整数除法!由于totaloccupied小于totaldrive,因此两者的除法结果为0。您应该先转换为双精度:

double percentageUsed = 100.0 * totalOccupied / totalDrive;

请注意,将小数点添加到100中确保它被视为一个double

1
如果totalOccupied和totalDrive都是long类型,那么即使乘以100.0也会得到0.0。 - Chintan Soni

1

这将从左到右进行评估,第一个整数除法将返回0(例如8/10评估为0)。要么将值转换为浮点数,要么执行100*a/b。浮点数将为您提供更精确的结果。


如果涉及的数字很大,使用float类型不会给出更精确的结果。 - paddy
如果你这样做(float)(100*a)/(float)b,它就会发生。两边将有一个相对较小数量级的差异,这是大多数精度损失发生的地方。 - Jason C
1
顺便说一句,谁曾经浏览并对这里的每个答案进行了负面评价,请留下建设性的评论。 - Jason C
2
如果目标是整数百分比,使用100*a/b的解决方案,其中a和b都是长整型,效果很好。只有在需要得到“85.5%”这样的答案时才需要使用浮点数或双精度浮点数。 - Patricia Shanahan

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