在长var bug上,Java解析字节数超过39.4 GB

时间:2011-05-11 22:55:17

标签: java math

我有一个获取ftp磁盘空间的应用程序。所以由一个数字给出的空间表示多少字节。

问题是当我的空间超过39.4 GB时,我可以在长或双变量中存储39.4 * 1024 * 1024 * 1024。所以,如果你有50 GB它只显示39.4。什么解决方案?

4 个答案:

答案 0 :(得分:3)

long can store much larger values - 所以代码中必须有特定内容。我猜到你的代码在做什么,看看这看起来是否熟悉:

class Out {
    public static void main(String args[]) {
        long l = 40L * 1024 * 1024 * 1024;
        double d = 40.0 * 1024 * 1024 * 1024;
        System.out.println("long l: " + l + " double d: " + d + "\n");
        return;
    }
}

$ vim Out.java ; javac Out.java ; java Out 
long l: 42949672960 double d: 4.294967296E10

请注意,我必须乘以40L而不是40 - 如果所有整数都以文字整数形式给出,没有特定的L long注释,那么Java将会将整个表达式解释为int。当使用和不使用L进行测试(并且仅通过1024 * 1024 * 102进行测试,以确认我的假设时),我发现差异很有趣:

$ vim Out.java ; javac Out.java ; java Out # with only '40'
long l: -16777216 double d: 4.294967296E10

$ vim Out.java ; javac Out.java ; java Out # with '40L'
long l: 4278190080 double d: 4.294967296E10

我希望这有助于解释为什么在代码中指定文字数据类型的类型很重要。

答案 1 :(得分:2)

以下是存储金额超过39.4 GB的解决方案:

final long kb = 1024L;
final long mb = 1024L*kb;
final long gb = 1024L*mb;
long solution = 42L * gb;  // > 39.4 GB in a long

答案 2 :(得分:1)

查看BigInteger类是否可以帮助您解决问题

http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html

编辑:

实际上正如其他人已经提到的那样,长值将能够保持一个非常大的价值,它可以保持远超过40gb的数值

答案 3 :(得分:0)

long可以记录8个Exa字节,即8 * 1024 * 1024 * 1024 GB(减去一个字节;)