Konvertieren von float zu double
Ich versuche zu konvertieren Single
zu Double
unter Beibehaltung des ursprünglichen Wertes. Ich habe festgestellt, das folgende Methode:
Single f = 5.2F;
Double d1 = f; //5.19999980926514
Double d2 = Double.Parse(f.ToString()); //5.2 (correct)
Ist diese Praxis zu empfehlen? Ich brauche nicht eine optimale Methode, aber der soll-Wert muss übergeben werden auf zu das doppelte. Gibt es auch Konsequenzen für die Speicherung eines gerundeten Wert in ein double?
Nicht alle floating-point-zahlen repräsentieren genau, weshalb 5.2 wird 5.19999980926514.
Von einer binären Sicht ist. 5.2 nicht dargestellt werden kann genau als binary floating-point-Zahl, so gibt es Ihnen der nächste Wert, den es zu können.
Ich verstehe, aber ist das nicht eine string-Konvertierung ein mutiger Schritt? Ist es vermeidbar?
Was sind Sie tun mit diesen zahlen? Ja, die Konvertierung einer single-in eine Zeichenfolge und analysieren, um eine doppelte ist wahrscheinlich nicht der beste Ansatz.
Vorzugsweise hard-coded, aber ich kann nicht davon ausgehen entweder. Floating-point-Logik ist mein absolutes Laster; was ich wirklich wissen müssen ist, wie zu konvertieren
Von einer binären Sicht ist. 5.2 nicht dargestellt werden kann genau als binary floating-point-Zahl, so gibt es Ihnen der nächste Wert, den es zu können.
Ich verstehe, aber ist das nicht eine string-Konvertierung ein mutiger Schritt? Ist es vermeidbar?
Was sind Sie tun mit diesen zahlen? Ja, die Konvertierung einer single-in eine Zeichenfolge und analysieren, um eine doppelte ist wahrscheinlich nicht der beste Ansatz.
Vorzugsweise hard-coded, aber ich kann nicht davon ausgehen entweder. Floating-point-Logik ist mein absolutes Laster; was ich wirklich wissen müssen ist, wie zu konvertieren
Single
zu Double
unter Beibehaltung des darstellungsprinzips im Fall der Wert war zwar hart-codiert, da die Werte serialisiert werden irgendwann. Ich glaube, ich verstehe, dass die direkte Single
zu Double
Konvertierung ist nicht schädlich, aber das ist eine Frage der Präsentation.InformationsquelleAutor toplel32 | 2015-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Umrechnung ist exakt. Alle
Single
Werte, die dargestellt werden können durch eineDouble
Wert, weil Sie "gebaut" werden in der gleichen Weise, nur mit mehr möglichen Ziffern. Was sehen Sie als 5.2 F ist in Wahrheit5.1999998092651368
. Wenn Sie gehen http://www.h-schmidt.net/FloatConverter/IEEE754.html und einfügen 5.2 du wirst sehen, dass es den Exponenten der 2^2 (so 4) und eine Mantisse von 1.2999999523162842. Wenn Sie nun multiplizieren Sie die beiden zahlen, die Sie erhalten 5.1999998092651368.Single
haben eine maximale Genauigkeit von 7-stellig, so .NET zeigt nur 7 Ziffern. Mit ein wenig Rundung 5.1999998092651368 ist 5.2InformationsquelleAutor xanatos
Könnten Sie "dezimal" statt einem string.
InformationsquelleAutor Baldurs
Wenn Sie wissen, dass Ihre zahlen sind Vielfache von z.B. 0.01, ich würde vorschlagen, dass Sie konvertieren verdoppeln, Runde auf die nächste ganze Zahl und subtrahieren, dass, um die Bruch-Rückstände. Multiplizieren Sie diese mit 100, Runden auf die nächste Ganzzahl, und dann geteilt durch 100. Hinzufügen, dass die ganze-Zahl-Teil, um die nächsten
double
Darstellung der vielfachen von 0.01, die am nächsten an der ursprünglichen Anzahl.Beachten Sie, dass je nachdem, wo die
float
Werte kam ursprünglich aus, eine solche Behandlung kann oder kann nicht die Genauigkeit verbessern. Die nächstenfloat
Wert 9000.02 ist über 9000.019531, und die nächstenfloat
Wert 9000.021 ist über 9000.021484 f. Wenn die Werte erreicht wurden, die durch Umwandlung 9000.020 und 9000.021 zufloat
, der Unterschied zwischen Ihnen sollte etwa 0,01. Wenn, jedoch, Sie waren angekommen, wie z.B. computing9000f+0.019531f
und9000f+0.021484f
, dann wird der Unterschied zwischen Ihnen sollte näher sein zu 0,02. Rundung auf die nächste 0.01 vor dem abziehen würde die Genauigkeit verbessern, die in den ersten Fall und zersetzen es in der letzteren.InformationsquelleAutor supercat