【问题标题】:Dividing long by long returns 0 [duplicate]长除以长返回 0 [重复]
【发布时间】:2013-08-08 02:34:25
【问题描述】:

我正在尝试计算 Windows 中已用磁盘空间的百分比,totaldrive 表示 Long 中 c 驱动器的总磁盘空间,而 freedrive 表示 Long 中的可用空间。

 long totaloccupied = totaldrive - freedrive;

这里计算使用百分比

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

打印语句返回 0。有人可以帮忙,因为我没有得到想要的值

【问题讨论】:

  • 嘿。这是漫长的一天,我喜欢在河上漂流......
  • 你为什么用Long而不是long?另外,请查看percentageUsed 的 Java 命名约定。

标签: java


【解决方案1】:

您可能将 long 与 long 相除,它指的是 (long/long = long) 操作,得到 long 结果(在您的情况下为 0)。

您可以通过将除法的任一操作数转换为浮点类型来实现相同的目的。

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

【讨论】:

    【解决方案2】:

    你正在做整数除法!由于totaloccupied 小于totaldrive,两者的除法给出0 的答案。您应该先转换为双精度:

    double percentageUsed = 100.0 * totalOccupied / totalDrive;
    

    请注意,将小数点添加到100 可确保将其视为double

    【讨论】:

    • 如果totalOccupied和totalDrive都长,那么即使乘以100.0也会得到0.0
    【解决方案3】:

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

    【讨论】:

    • 如果涉及的数字很大,float不会给出更精确的结果。
    • 如果你做 (float)(100*a)/(float)b,它会。两侧将相差一个相对较小的数量级,这是大多数精度损失发生的地方。
    • 顺便说一句,无论谁通过并否决了这里的每个答案,请留下建设性的评论。
    • 如果目标是一个整数百分比,那么 100*a/b 解决方案(a 和 b 都长)会很好地工作。仅需要浮点数或双精度数才能获得“85.5%”之类的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2020-07-12
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多