Java数学(运行时内存百分比)

时间:2013-01-25 20:30:26

标签: java math runtime percentage

我确信我在这里犯了一些非常愚蠢的错误。 我有这个代码:

private static String generateRAM()
{
    final long RAM_TOTAL = Runtime.getRuntime().totalMemory();
    final long RAM_FREE = Runtime.getRuntime().freeMemory();
    final long RAM_USED = RAM_TOTAL - RAM_FREE;
    final long RAM_TOTAL_MB = RAM_TOTAL / 8 / 1024;
    final long RAM_FREE_MB = RAM_FREE / 8 / 1024;
    final long RAM_USED_MB = RAM_USED / 8 / 1024;
    final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;
    return RAM_TOTAL_MB + "MB TOTAL / " + RAM_FREE_MB + "MB FREE / " + RAM_USED_MB + "MB USED (" + RAM_USED_PERCENTAGE + "%)"; 
}

返回:

15440MB TOTAL / 11809MB FREE / 3630MB USED (0.0%)

百分比显然不正确。 这是怎么发生的? 就我所知,我是正确的,我的所有数学都是正确的。 如果我将给定的数字打入计算器并自己找到百分比,我得到23.5,我的预期结果。

我确定我犯了一个可怕的错误,我会踢自己,是否有人可以启发我?

3 个答案:

答案 0 :(得分:3)

final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;

这是因为整数分裂。将其中一种类型转换为双倍。

示例:

final double RAM_USED_PERCENTAGE = ((double)RAM_USED / RAM_TOTAL) * 100;

根据JLS 15.17.2. Division Operator /

  

整数除法向0舍入。也就是说,操作数n和d为二进制数字提升后的整数(第5.6.2节)产生的商是一个整数值q,其大小尽可能大,同时满足| d· q | ≤| n |。此外,当| n |时,q为正≥| d |并且n和d具有相同的符号,但是当| n |时q为负≥| d |和n和d有相反的符号。

     

有一个特殊情况不符合这条规则:如果是   股息是其最大可能幅度的负整数   类型,除数是-1,然后发生整数溢出   结果等于股息。尽管溢出,但没有例外   扔在这种情况下。另一方面,如果除数的值在   整数除法为0,然后抛出ArithmeticException。

答案 1 :(得分:1)

更改此行

final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;

final double RAM_USED_PERCENTAGE = ((RAM_USED * 1.0) / RAM_TOTAL) * 100;

这是因为Java将结果解释为long / long除法,因此结果将是long值,即5/10 => 0.通过应用任何操作数的1.0因子,编译器将执行double / long操作,这将导致double值。

答案 2 :(得分:1)

您有2个错误。 freeMemory()totalMemory()返回多个字节,因此要将其转换为MB,必须将其除以1024(kB和MB),然后除以8.另外,您必须将RAM_USED转换为double,以便将其计算为浮点运算:

private static String generateRAM()
{
    final long RAM_TOTAL = Runtime.getRuntime().totalMemory();
    final long RAM_FREE = Runtime.getRuntime().freeMemory();
    final long RAM_USED = RAM_TOTAL - RAM_FREE;
    final long RAM_TOTAL_MB = RAM_TOTAL / 1024 / 1024;
    final long RAM_FREE_MB = RAM_FREE  / 1024 / 1024;
    final long RAM_USED_MB = (double) RAM_USED / 1024 / 1024;
    final double RAM_USED_PERCENTAGE = ((double) RAM_USED / RAM_TOTAL) * 100;
    return RAM_TOTAL_MB + "MB TOTAL / " + RAM_FREE_MB + "MB FREE / " + RAM_USED_MB + "MB USED (" + RAM_USED_PERCENTAGE + "%)";
}

返回:

10MB TOTAL / 9MB FREE / 0MB USED (2.47130735892926%)