2017-10-19 1 views
0

Ich habe einen Float-Wert wie folgt aus: 0,60000002384185791 ich diesen Wert auf Zeichenfolge wie folgt umwandeln möchten: 0,60000002384185791 (genau gleich - keine wissenschaftliche Notationen oder Clipping-off Präzision)Wie wird der numerische Wert der Bruchzahl in die Zeichenfolge "so wie sie ist" umgewandelt?

Aber immer, wenn ich zu konvertieren versuchen, dieser Wert auf Zeichenfolge, es gibt mir ",600000023841858"

Code:

Dim ddd As Decimal = 0.60000002384185791 '//This value is coming from some method and it may be different like 0.6000000238418579123456789012 or 102020.6000000238418579123456789012 
Dim myVal as string = " Your Value is : " & ddd.ToString() '//This truncates actual value to 0.600000023841858 

Gibt es eine Möglichkeit, diesen Wert "so wie er ist" zu konvertieren (ohne wissenschaftliche Notationen und ohne Abschneiden der Genauigkeit)?

Es funktioniert gut bis zu einigen Grenzen in C#, aber ich brauche eine Lösung in Visual Basic. Gibt es etwas mit Sprache zu tun (ich hoffe nicht).

+0

D auf die Zahl hinzufügen, so dass es eine Dezimalzahl ist? Könnte als Floating Point behandelt und beim Kompilieren abgeschnitten werden –

+1

Wie @SamiKuhmonen sagt, besteht das Problem in Ihrem Beispiel darin, dass Ihre Konstante '0.60000002384185791' ein Double ist, das nicht viele Ziffern enthalten kann. Setzen Sie 'Option Strict On ', um automatische Konvertierungen zu verbieten und stellen Sie sicher, dass der Wert, den Sie von" irgendeiner Methode "erhalten, niemals in ein Double konvertiert wird. – Blackwood

+0

@SamiKuhmonen, @Schwarzholz: Ich habe das auch getan, aber kein Glück. Tatsächlich hält mein 'Double' diesen Wert. Wenn ich den Mauszeiger darüber bewege, wird mir der korrekte Wert angezeigt, d. H. '0.60000002384185791' Wenn ich aber den Funktionsrückgabetyp auf' Decimal' ändere, wird nur '06D' zurückgegeben. –

Antwort

1

Sie Zustand in den Kommentaren:

Eigentlich hält mein Doppel diesen Wert.

Ich glaube, was Sie suchen, ist die The Round-trip ("R") Format Specifier.

Der Round-Trip ("R") - Formatbezeichner versucht sicherzustellen, dass ein numerischer Wert, der in eine Zeichenfolge konvertiert wird, wieder in denselben numerischen Wert umgewandelt wird. Dieses Format wird nur für die Typen Single, Double und BigInteger unterstützt.

Für Doppel- und Einzelwerte, schlägt die „R“ Formatbezeichner in einigen Fällen den ursprünglichen Wertes erfolgreich zu Round-Trip und bietet auch relativ schlechte Leistung. Stattdessen empfehlen wir Ihnen, den Formatbezeichner "G17" für Double-Werte und den Formatbezeichner "G9" für die erfolgreiche Rundung von Einzelwerten zu verwenden.

Beispiel:

Dim ddd As Decimal = 0.60000002384185791D 
Dim originalDouble As Double = ddd 

Dim originalDoubleAsString As String = originalDouble.ToString("R") 
Console.WriteLine(originalDoubleAsString) 

Dim roundTripDouble As Double = Double.Parse(originalDoubleAsString) 
Console.WriteLine("double round tripped correctly: {0}", (originalDouble = roundTripDouble)) 

Ausgang:

0,60000002384185791

doppelte Runde richtig ausgelöst: Wahre

+0

Vielen Dank für Ihre Zeit und Unterstützung. Ich habe Ihre Antwort als Antwort markiert, da sie für mich bis zu 17 Dezimalstellen funktioniert. Wir haben immer noch Herausforderung, dass, wenn Dezimal hält Präzision, die größer als 17 Zeichen ist, dann wird dies nicht als Doppel arbeiten kann Präzision nicht halten mehr als 17 Zeichen Like: ddd = 0.6000000238418579122233344456D Mýval = ddd ‚Dies gilt ,60000002384185791 in Doppel und nicht "tatsächliche" Dezimal Und auch wir können nicht etwas wie unten schreiben, wie es nicht unterstützt wird: Dim engineeringValue als String = ddd.ToString ("R") "" R "ist nicht für Dezimalzahlen gemacht –

Verwandte Themen