Long float-вывод числа показывает буквы
У меня есть следующий код:
String curDir = ".";
File fileObject = new File(curDir);
File[] fileList = fileObject.listFiles();
float fileLengthMegabytes = (float)fileList[i].length() / 1000000;
метод fileList[i].length () возвращает 311 байт в качестве типа Long.
предыдущий код приводит к следующему выводу:
3.88 E-4
Как получить ожидаемый результат 0,000311 внутри переменной fileLengthMegabytes?
5 ответов
это научная нотация.
и вы получаете 388 вместо 311, потому что вы делите на 1000000 вместо 1048576 (1024 * 1024)
EDIT: 311 не достигается даже с 1048576, таким образом, вы получаете 370... таким образом, ошибка, вероятно, в вашем calc;)
As описано здесь, вам просто нужно преобразовать свою научную нотацию в десятичную нотацию через форматер.
DecimalFormat df = new DecimalFormat("#.########");
return df.format(fileLengthMegabytes);
запуск Пример: http://ideone.com/2lkKv7
import java.util.*;
import java.lang.*;
import java.text.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
DecimalFormat df = new DecimalFormat("#.##########");
float fileLengthMegabytes1 = (float) 388 / 1000000;
float fileLengthMegabytes2 = (float) 388 / 1048576;
System.out.println("MB1 in Scientific Notation: " +
fileLengthMegabytes1);
System.out.println("MB1 in Decimal Notation: " +
df.format(fileLengthMegabytes1));
System.out.println("MB2 in Scientific Notation: " +
fileLengthMegabytes2);
System.out.println("MB2 in Decimal Notation: " +
df.format(fileLengthMegabytes2));
}
}
выход:
MB1 в научной нотации: 3.88 E-4
MB1 в десятичной системе счисления: 0.000388
MB2 в научной нотации: 3.7002563 E-4
mb2 в в десятичном виде: 0.0003700256
Это способ отображения чисел с плавающей запятой Java(и многих других языков). E
значит 10^
, so 3.88E-4
это другой способ написания 3.88 x 10^-4
, что то же самое, что 0.000388
.
этот формат называется научная нотация. е-нотации - это компьютерная научной нотации.
остальная часть вашей неточности (388 против 311) заключается в том, что 1000000-это не точное число, которое вы хотите разделить. Видеть другие ответы для более подробной информации.
3.88 E-4, Как упоминалось ранее, является представлением в научная электронная нотации.
Если вы хотите распечатать или преобразовать в строку, можно написать что-то вроде этого:
System.out.printf("%f%n", fileLengthMegabytes);
// or
String fileLengthMegabytesMessage = String.format(
"File size is %fMb", fileLengthMegabytes);
System.out.println(fileLengthMegabytesMessage);
и у тебя есть:
0,000311
// or
File size is 0,000311Mb
С уважением
Если вы хотите нормальные номера (без научной нотации), используйте BigInteger
BigInteger inbytes = new BigInteger("" + fileList[i].length());
BigInteger inMB = inBytes.divide(new BigInteger("" + (1024*1024)));
Примечание: Нормальная double
стоимость также будет достаточно.
чтобы получить нужную нотацию, используйте формат:
final Formatter f = new Formatter();
final String out = f.format("%8.6f", fileLengthMegabytes);
должно дать вам ваш результат.
Смотрите также: Java Doc: Строка.Формат, Java Doc: Форматирование