2012-11-13 7 views
9

Ich habe den folgenden Code:Lange schwimmerNummer Ausgabe zeigt Buchstaben

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

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

Die Methode filelist [i] .length() liefert 311 Bytes als Typ Long.

Der vorherige Code ergibt die folgende Ausgabe:

3.88E-4

Wie erhalte ich meine erwartete Ausgabe von 0,000311 in dem fileLengthMegabytes Variable?

+1

, die ein ganz normales floating ist Punktanzeigetyp. "E" bedeutet "mal 10 hoch", z. "3,88 mal 10 zur Potenz von -4". –

+1

Es sieht so aus, als ob Sie nur wissenschaftliche Notation drucken. Der Wert hat sich nicht geändert. [Java number format] (http://docs.oracle.com/javase/6/docs/api/java/text/NumberFormat.html) –

+0

Wie viele doppelte Antworten brauchen wir? –

Antwort

17

Das ist wissenschaftliche Notation.

und Sie bekommen 388 statt 311 da Sie von 1000000 statt 1048576 (1024 * 1024) sind Dividieren

EDIT: 311 noch nicht erreicht man 370 mit 1048576, auf diese Weise bekommen ... so die Fehler ist wahrscheinlich in Ihrem Kalk;)

Als described here, müssen Sie nur Ihre wissenschaftliche Notation in eine Dezimalzahl durch einen Formatierer konvertieren.

DecimalFormat df = new DecimalFormat("#.########"); 
return df.format(fileLengthMegabytes); 

Lauf Beispiel: 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)); 
     } 
} 

Ausgang:

MB1 in wissenschaftlicher Notation: 3.88E-4

MB1 in Dezimal Notation: 0,000388

MB2 in wissenschaftlicher Notation: 3.7002563E-4

MB2 in Dezimal Notation: 0,0003700256

6

So zeigt Java (und viele andere Sprachen) Fließkommazahlen an. E bedeutet nur 10^, also 3.88E-4 ist eine andere Art zu schreiben 3.88 x 10^-4, die das gleiche wie 0.000388 ist.

Dieses Format wird scientific notation genannt. E-notation ist eine Computerdarstellung der wissenschaftlichen Notation.

Der Rest Ihrer Ungenauigkeit (388 vs 311) ist, weil 1000000 nicht die genaue Zahl ist, durch die Sie teilen möchten. Weitere Informationen finden Sie in den anderen Antworten.

+0

gibt es eine Möglichkeit, "E" durch "10 ^" zu ersetzen, während es gedruckt wird? – asgs

0

Wenn Sie normale Zahlen (ohne wissenschaftliche Schreibweise) wollen, BigInteger

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

Hinweis verwenden: Normal double Wert würde auch ausreichen.

0

Um die Notation zu erhalten Sie möchten, verwenden Sie einen Formatierer:

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

sollten Sie Ihr Ergebnis.auch

Siehe: Java Doc: String.Format, Java Doc: Formatter

1

3.88E-4 wie bereits erwähnt eine Darstellung in der scientific E-notation ist.

Wenn Sie möchten, um es zu drucken oder zu String konvertieren Sie so etwas schreiben:

System.out.printf("%f%n", fileLengthMegabytes); 
// or 
String fileLengthMegabytesMessage = String.format(
     "File size is %fMb", fileLengthMegabytes); 
System.out.println(fileLengthMegabytesMessage); 

und Sie haben:

0,000311 
// or 
File size is 0,000311Mb 

respekt

Verwandte Themen