2017-06-21 3 views
0

Ich lief vor kurzem in der folgenden Neugier:Präzision beim Gießen von Double zu Float beim Verketten von String?

double d=0.8608278036117554; 
    String precision="float"; 

    float f=(float)d; 
    String s="a " + (precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s2="a " + String.valueOf(precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s3="a " + (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) + " Bonjour"; 


    println(d); 
    println(f); 
    println(s); 
    println(s2); 
    println(s3); 


//0.8608278036117554 
//0.8608278 
//a 0.8608278036117554 Bonjour 
//a 0.8608278036117554 Bonjour 
//a 0.8608278 Bonjour 

Warum ist es nicht möglich, einen schönen Schwimmer zu haben, wenn s oder s2 Berechnung? Warum ist es immer noch ein Doppel in Fall s und s2?

PS: Diese Frage hat meiner Meinung nach nichts mit Zahlenformatierung zu tun. Ich möchte wirklich verstehen, warum die (float) d Besetzung nicht funktioniert !!

+1

Das Ergebnis eines 'boolean? float: double' ist ein 'double' Es wird geworfen, um zu floaten, aber das wird zu einem Double zurückgeworfen. –

Antwort

3

Ihr Ausdruck precision.equals("float") ? (float)d: d hat keine Auswirkung, da der Bedingungsoperator resultierend eine einzige Art hat, die double ist, wenn ein Argument den Typ hat float und der andere hat den Typ double.

So ist die erste Alternative wird von float zu double und während der Umstellung von double zu float und zurück zu double kann auf dem Wert einen Effekt erweitert werden, String.valueOf(double) wird in jedem Fall aufgerufen werden.

Sie können stattdessen (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) verwenden, deren Methodenaufrufe nicht redundant sind, da sie Aufrufe verschiedener Methoden sind, String.valueOf(float) und String.valueOf(double).

Das heißt, Sie sollten keine Verengung float verwenden, um den Ausgang zu steuern. Überprüfen Sie Format Float to n decimal places auf Alternativen, die mehr Kontrolle über die formatierte Ausgabe bieten.

+0

Ich verstehe jetzt besser. Aber wenn es zu einem Float und zurück zum Double gewandert ist, wie kommt dann die Präzision nicht verloren? Sollte ich nicht am Ende ein paar Nullen anstelle der echten doppelten Dezimalzahlen haben? – Myoch

+1

Die Genauigkeit von 'float' und' double' ist definiert als * binäre * Ziffern, keine Dezimalziffern. Für einige Werte kann diese Konvertierung einige Nicht-Null-Bits abschneiden (deshalb habe ich gesagt, * kann * eine Auswirkung auf den Wert haben), aber der resultierende Wert ist nicht notwendigerweise ein Wert mit weniger Dezimalziffern. – Holger

+0

In der Tat habe ich die Besetzung hin und her versucht, getrennt vom ganzen "String" Zeug, bekomme ich das gleiche Doppel aus dem Float. Also, wenn ich es gut verstehe, ist es wirklich eine Frage des Zufalls, die zum selben Doppel führte, und hätte ich ein anderes Beispiel gewählt, hätte ich eine Veränderung der Ziffern erkennen können, oder? – Myoch

Verwandte Themen