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: Форматирование