10

次のコードがあります。

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

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

メソッド fileList[i].length() は、Long 型として 311 バイトを返します。

前のコードにより、次の出力が得られます。

3.88E-4

fileLengthMegabytes 変数内で期待される 0,000311 の出力を取得するにはどうすればよいですか?

4

5 に答える 5

21

それが科学表記法です。

そして、1048576 (1024 * 1024) ではなく 1000000 で除算しているため、311 ではなく 388 が得られます。

編集: 311 は 1048576 でも達成されません。そのようにして 370 を取得します...したがって、エラーはおそらくあなたの計算にあるでしょう ;)

here で説明されているように、フォーマッターを使用して科学表記法を 10 進表記法に変換するだけです。

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

10 進表記の MB1: 0.000388

科学表記法の MB2: 3.7002563E-4

10 進表記の MB2: 0.0003700256

于 2012-11-13T15:27:55.583 に答える
6

これは、Java(および他の多くの言語)が浮動小数点数を表示する方法です。Eは単にを意味する10^ので、と同じ3.88E-4別の書き方もあります。3.88 x 10^-40.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 Doc: String.FormatJava Doc: Formatter

于 2012-11-13T15:35:19.577 に答える