Konvertieren von Zeichenfolgen in Float in C #

108

Ich konvertiere eine Zeichenfolge wie "41.00027357629127" und verwende;

Convert.ToSingle("41.00027357629127");

oder

float.Parse("41.00027357629127");

Diese Methoden geben 4.10002732E + 15 zurück .

Wenn ich in float konvertiere, möchte ich "41.00027357629127". Diese Zeichenfolge sollte dieselbe sein ...

Mehmet
quelle
1
Woher wissen Sie, in was es konvertiert wird - so zeigen Sie die Zahl an
mmmmmm
1
Irgendeine Idee, warum es ToSingle ist? Und nicht ToFloat?
Lord Darth Vader
41.00027357629127 darf in wissenschaftlicher Notation nicht 4.10002732E + 15 sein, es sei denn, Ihre Kultur verwendet natürlich ein Dezimalkomma anstelle eines Dezimalpunkts (und einen Punkt als Tausendertrennzeichen), sodass die Zahl tatsächlich lautet: 4100027357629127 wird folglich als 4.10002732E + 15
ljgww angezeigt

Antworten:

229

Das Gebietsschema Ihres Threads ist auf eins festgelegt, bei dem die Dezimalstelle "," anstelle von "." Ist.

Versuchen Sie Folgendes:

float.Parse("41.00027357629127", CultureInfo.InvariantCulture.NumberFormat);

Beachten Sie jedoch, dass ein Float nicht so viele Stellen Genauigkeit enthalten kann. Sie müssten dazu double oder Decimal verwenden.

Matthew Watson
quelle
35
Vergessen Sie nicht, den Namespace using System.Globalization;für den Zugriff hinzuzufügenCultureInfo
Mobiletainment
24

Erstens ist es nur eine Darstellung der floatNummer, die Sie im Debugger sehen. Der tatsächliche Wert ist ungefähr genau (so viel wie möglich).

Hinweis: Verwenden Sie immer CultureInfo- Informationen, wenn Sie mit Gleitkommazahlen oder Zeichenfolgen arbeiten.

float.Parse("41.00027357629127",
      System.Globalization.CultureInfo.InvariantCulture);

Dies ist nur ein Beispiel; Wählen Sie eine geeignete Kultur für Ihren Fall.

Tigran
quelle
Wie kann ich meine CultureInfo auswählen? Ich bin in der Türkei, wo ich TR-TR hinzufügen werde?
Mehmet
1
@ Mehmetnew System.Globalization.CultureInfo("tr-TR")
Show
20

Sie können Folgendes verwenden:

float asd = (float) Convert.ToDouble("41.00027357629127");
user4292249
quelle
4
Bitte geben Sie einen Kontext an, warum dies die richtige Antwort ist.
Bas Peeters
7

Verwenden Convert.ToDouble("41.00027357629127");

Convert.ToDouble Dokumentation

Ozgur Dogus
quelle
2
Ändert dies nicht den Datentyp von float in double? OP wollte schweben.
Nell Martinez
4

Die Genauigkeit von float beträgt 7 Stellen. Wenn Sie das gesamte Los behalten möchten, müssen Sie den Doppeltyp verwenden, der 15-16 Ziffern enthält. Informationen zur Formatierung finden Sie in einem Beitrag zum Formatieren von Doppeln . Und Sie müssen sich um Dezimaltrennzeichen in C # kümmern .

jpe
quelle
ı müde double.Parse es gibt 4100027357629127.0 es ist schade
Mehmet
2
Das klingt nach dem '.' Zeichen ist nicht das Dezimaltrennzeichen in Ihrem Gebietsschema? Schauen Sie sich stackoverflow.com/questions/3870154/c-sharp-decimal-separator
jpe
0

Sie können double.Parse("41.00027357629127");

ABH
quelle
Ich glaube nicht, dass er fragt, wie er es abrunden soll.
ODER Mapper
-2

Sie können das Parsen mit double anstelle von float verwenden, um einen genaueren Wert zu erhalten.

Lerner
quelle