我确信我在这里犯了一些非常愚蠢的错误。 我有这个代码:
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,我的预期结果。
我确定我犯了一个可怕的错误,我会踢自己,是否有人可以启发我?
答案 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%)