[英]Java Maths (Runtime Memory 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,这是我的预期结果。
我敢肯定,我犯了一个可怕的错误,我会自欺欺人,有人能启发我吗?
final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;
这是因为整数除法。 将其中一种类型转换为双精度。
例:
final double RAM_USED_PERCENTAGE = ((double)RAM_USED / RAM_TOTAL) * 100;
整数除法朝着0取整。也就是说,在二进制数值提升(第5.6.2节)之后为操作数n和d产生的商是整数值q,其大小应尽可能大,同时满足| d·q | ≤| n |。 此外,当| n |时q为正。 ≥| d | 和n和d具有相同的符号,但是| n |时q为负。 ≥| d | n和d具有相反的符号。
有一种特殊情况不满足此规则:如果被除数是该类型最大可能的负整数,并且除数为-1,则发生整数溢出并且结果等于被除数。 尽管有溢出,在这种情况下也不会引发异常。 另一方面,如果整数除数中的除数的值为0,则抛出ArithmeticException。
更改此行
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。通过将任何操作数的系数double
1.0,编译器将执行double
/ long
操作,将导致值double
。
您有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%)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.