2010-03-19 15 views
14

Ich versuche, zu berechnen (360/24)/60 Ich erhalte die Antwort 0.0, wenn ich 0,25Warum (360/24)/60 = 0 ... in Java

In Worten bekommen sollte: Ich wollen 360 durch 24 teilen und teilen das Ergebnis dann mit 60

public class Divide { 

    public static void main(String[] args){ 
     float div = ((360/24)/60); 
     System.out.println(div); 

    } 
} 

Dies gibt:

0,0

Warum ist das so? Mache ich etwas wirklich dumm, oder gibt es einen guten Grund dafür

+1

habe ich versucht, das gleiche mit GCC (C) und es leidet das gleiche Problem. –

Antwort

29

Keiner der Operanden in der Arithmetik ist ein float - so wird alles mit Integer-Arithmetik und dann in einen Float umgewandelt. Wenn Sie den Typ eines geeigneten Operanden mit einem Schwimmer ändern, wird es funktionieren:

float div = ((360/24f)/60); // div is now 0.25 

Beachten Sie, dass, wenn Sie nur 60 geändert, um einen Schwimmer zu sein, würden Sie mit dem 360/24 am Ende wird durchgeführt als Integer-Arithmetik - das ist in diesem speziellen Fall in Ordnung, stellt aber nicht das dar, was ich eigentlich für richtig halte. Grundsätzlich müssen Sie sicherstellen, dass die arithmetische Operation auf die von Ihnen gewünschte Weise ausgeführt wird.

+0

Genauer: 360/24 = 15 15/60 = 0 Abgerundet immer auf ganze Zahlen;) – TomTom

+7

* seufz *. Monomorphe numerische Literale verwechseln Menschen. Polymorphe numerische Literale verwechseln Menschen. Du kannst einfach nicht gewinnen. –

24

Sie machen tatsächlich Integer-Division (JLS 15.17.2).

float div = ((360/24)/60); 
float div = (float) ((360/24)/60); 
float div = (float) (15/60); 
float div = (float) (0); 
float div = 0F; 

Um eine Gleitkommadivision durchzuführen, muss mindestens einer der Operanden ein numerischer Gleitkommatyp sein.

float div = ((360F/24)/60); 
float div = 15F/60; 
float div = 0.25F; 

Tipp: Wenn Präzision wichtig ist, möchten Sie mit double so viel von der Berechnung zu tun, bevor sie float konvertieren. In der Tat, es sei denn, Ihr Profil zeigt, dass Sie unbedingt float benötigen, sollten Sie immer double bevorzugen.

float f; 

    f = (1E-17F * 1E-17F); 
    System.out.println(f); // prints "9.999999E-35" 

    f = (float) (1E-17D * 1E-17D); 
    System.out.println(f); // prints "1.0E-34" 
+0

meinst du nicht "double" in "Eigentlich solltest du" float "fast immer" verwenden? –

+0

Ja, einige Tippfehler. Fest. – polygenelubricants

2

In Ihrem Hauptverfahren

public static void main(String[] args){ 
     float div = ((360/24)/60); 
     System.out.println(div); 
} 

Beachten Sie, dass 360, 24 und 60 alle Werte integer sind. So erhalten Sie seltsame Werte.

360/24 -> 15 (völlig in Ordnung)
15/60 -> 0.4 (floating point)

Leider können Sie für Gleitkommazahlen so abgeschnitten werden Sie erhalten:

-> 0 (integer value) 

Wenn Sie dann 0 einer Gleitkommavariable zuweisen, ändern Sie 0 in einen Fließkommawert von 0.0. Also das Ergebnis.

Wenn Sie sie teilen möchten, müssen Sie sie in Fließkommawerte ändern.

Der richtige Code sollte so beschaffen sein:

public static void main(String[] args){ 
     float div = ((360.0/24.0)/60.0); 
     System.out.println(div); 
}