#java #math
#java #математика
Вопрос:
У меня есть приложение, которое получает место на диске ftp. итак, пространство задается числом, которое показывает, сколько байт.
проблема в том, что когда у меня есть место более 39,4 ГБ, я могу просто хранить 39.4*1024*1024*1024 в длинной или двойной переменной. итак, если у вас есть 50 ГБ, он просто покажет вам 39,4. каково решение?
Комментарии:
1. К сожалению, я не могу понять ваш вопрос. Не могли бы вы, пожалуйста, вставить свой код, его выходные данные и то, каким вы ожидали его получить? Спасибо
2. Вы, должно быть, делаете что-то не так. В long вы, вероятно, сможете хранить размеры примерно до 2 ^ 33 или 16 миллиардов гигабайт
3. Как сказал Ingo, вы должны быть в состоянии уместить количество байтов в 39,4 ГБ в 64-разрядное целое число длиной в несколько сотен миллионов раз…
4. Вы, должно быть, делаете что-то неправильно, но пока вы не покажете код, подтверждающий ваше утверждение, мы не можем сказать вам, что это.
5. @Ingo Длинные значения Java подписаны 64-разрядно, поэтому ограничение равно 2 ^ 63 — 1 (возможно, 33 в вашем комментарии были опечаткой?). Это около 8 миллиардов гигабайт (фактически на 1 байт меньше 8 эксабайт — или эксбибайт, если вы предпочитаете странные имена).
Ответ №1:
long
может хранить гораздо большие значения — поэтому в вашем коде должно быть что-то конкретное. Я догадался, что делает ваш код, посмотрите, выглядит ли это знакомо:
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
Я надеюсь, это помогает объяснить, почему важно указывать типы литеральных типов данных в коде.
Ответ №2:
Вот решение для хранения объема, превышающего 39,4 ГБ:
final long kb = 1024L;
final long mb = 1024L*kb;
final long gb = 1024L*mb;
long solution = 42L * gb; // > 39.4 GB in a long
Ответ №3:
Посмотрите, поможет ли класс BigInteger вам с вашей проблемой
http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html
Редактировать:
На самом деле, как уже упоминалось другими, long value сможет содержать действительно большое значение, оно может содержать гораздо больше, чем 40 ГБ в виде числового значения
Ответ №4:
long
можно записать 8 Exa-байт, которые 8 * 1024 * 1024 * 1024 ГБ (минус один байт 😉