2012-08-10 16 views
6

In Java können wir implizit ein int in float umwandeln, was zu einem Genauigkeitsverlust führen kann, wie im folgenden Beispielcode gezeigt.Java ermöglicht die implizite Konvertierung von int in float. Warum?

public class Test { 
    public static void main(String [] args) { 
     int intVal = 2147483647; 
     System.out.println("integer value is " + intVal); 
     double doubleVal = intVal; 
     System.out.println("double value is " + doubleVal); 
     float floatVal = intVal; 
     System.out.println("float value is " + floatVal); 
     } 
} 

Der Ausgang ist

integer value is 2147483647 
double value is 2.147483647E9 
float value is 2.14748365E9 

Was ist der Grund, implizite Konvertierung von int hinter erlaubt, zu schweben, wenn es ein Verlust an Präzision ist?

+0

Duplizieren von http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co –

+0

@ AaronKurtzhals: Diese Frage betrifft eine andere Sprache. – Wug

Antwort

6

Sie befinden sich wahrscheinlich fragen:

Warum ist dies eine implizite Umwandlung, wenn es zu einem Verlust von Informationen? Sollte dies nicht eine explizite Umwandlung sein?

Und Sie haben natürlich einen guten Punkt. Die Sprachdesigner entschieden jedoch, dass eine implizite Konvertierung zulässig ist, wenn der Zieltyp einen Bereich aufweist, der groß genug ist, auch wenn es zu einem Genauigkeitsverlust kommen kann. Beachten Sie, dass es die Bereich ist, die wichtig ist, nicht die Genauigkeit. Ein float hat einen größeren Bereich als ein int, es handelt sich also um eine implizite Konvertierung.

Die Java specification sagt der folgende:

eine Verbreiterung Umwandlung eines int oder einen langen Wert zu schweben, oder eines langen Wert zu verdoppeln, in Genauigkeitsverlust führen kann - das heißt, das Ergebnis kann einige der niedrigstwertigen Bits des Werts verlieren. In diesem Fall ist der resultierende Gleitkommawert eine korrekt abgerundete Version des ganzzahligen Werts, wobei IEEE 754 Round-To-Nearest-Modus verwendet wird.

+0

Irgendeine Idee warum 32-Bit 'float' als breiter als 64-bit' long' betrachtet wird? –

+2

@PeterLawrey: Ein Schwimmer hat eine Reichweite von -3.4e + 38 bis 3.4e + 38 (ungefähr). Ein Long hat eine Bandbreite von -9,2e18 bis -9,2e18. Da der Schwimmer die größere Reichweite hat, ist er breiter. –

+0

Das ist wahrscheinlich das Denken. Das Problem, das ich habe, ist, wenn Sie ein 'long' zu einer Methode übergeben, die einen' float' aus Versehen nimmt und 64-Bit-Präzision in 24-bit umwandelt: P –

Verwandte Themen