10

我有以下代码:

String curDir = ".";
File fileObject = new File(curDir);
File[] fileList = fileObject.listFiles();

float fileLengthMegabytes = (float)fileList[i].length() / 1000000;

方法 fileList[i].length() 返回 311 个字节作为 Long 类型。

前面的代码产生以下输出:

3.88E-4

如何在 fileLengthMegabytes 变量中获得预期的 0,000311 输出?

4

5 回答 5

21

那就是科学记数法。

你得到 388 而不是 311 因为你除以 1000000 而不是 1048576 (1024 * 1024)

编辑:即使使用 1048576 也没有达到 311,这样你得到 370 ......所以错误可能在你的计算中;)

如此处所述,您只需通过格式化程序将科学记数法转换为十进制记数法。

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.88E-4

十进制表示法的 MB1:0.000388

MB2 科学计数法:3.7002563E-4

十进制表示法的 MB2:0.0003700256

于 2012-11-13T15:27:55.583 回答
6

这是 Java(和许多其他语言)显示浮点数的方式。Ejust 表示10^,so3.88E-4是另一种写法3.88 x 10^-4,与0.000388.

这种格式称为科学记数法电子记数法是科学记数法的计算机表示。

其余的不准确(388 对 311)是因为 1000000 不是您想要除以的确切数字。有关更多详细信息,请参阅其他答案。

于 2012-11-13T15:25:13.073 回答
1

前面提到的 3.88E-4 是科学 E 表示法中的表示

如果你想打印它或转换成字符串,你可以这样写:

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

尊敬

于 2012-11-13T15:42:03.477 回答
0

如果您想要普通数字(没有科学计数法),请使用BigInteger

BigInteger inbytes = new BigInteger("" + fileList[i].length());
BigInteger inMB = inBytes.divide(new BigInteger("" + (1024*1024)));

注意:正常值double也足够了。

于 2012-11-13T15:31:27.320 回答
0

要获得所需的符号,请使用格式化程序:

final Formatter f = new Formatter();
final String out = f.format("%8.6f", fileLengthMegabytes);

应该给你你的结果。

另请参阅: Java 文档:String.FormatJava 文档:格式化程序

于 2012-11-13T15:35:19.577 回答