Konwertowanie ciągu na zmiennoprzecinkowy w C #

108

Konwertuję ciąg, taki jak „41.00027357629127”, i używam;

Convert.ToSingle("41.00027357629127");

lub

float.Parse("41.00027357629127");

Te metody zwracają 4.10002732E + 15 .

Kiedy konwertuję na zmiennoprzecinkowe, chcę mieć wartość „41.00027357629127”. Ten ciąg powinien być taki sam ...

Mehmet
źródło
1
Skąd wiesz, na co jest konwertowany - tak wyświetlasz liczbę
mmmmmm
1
Każdy pomysł, dlaczego jest to ToSingle? A nie ToFloat?
Lord Darth Vader
41.00027357629127 nie będzie równe 4,10002732E + 15 w notacji naukowej, chyba że oczywiście twoja kultura używa przecinka dziesiętnego zamiast przecinka (i kropki jako separatora tysięcy), więc liczba faktycznie brzmiałaby: 4100027357629127 w konsekwencji zostanie wyświetlona jako 4.10002732E + 15
ljgww

Odpowiedzi:

230

Ustawienia regionalne Twojego wątku to takie, w których znak dziesiętny to „,” zamiast „.”.

Spróbuj użyć tego:

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

Należy jednak pamiętać, że zmiennoprzecinkowy nie może pomieścić tylu cyfr precyzji. Aby to zrobić, musisz użyć double lub Decimal.

Matthew Watson
źródło
35
nie zapomnij dodać przestrzeni nazw, using System.Globalization;aby uzyskać dostępCultureInfo
Mobiletainment,
24

Po pierwsze, jest to tylko prezentacja tego floatnumeru można zobaczyć w debuggera. Prawdziwa wartość wynosi około dokładny (tyle, ile jest to możliwe).

Uwaga: Zawsze używaj informacji CultureInfo, gdy masz do czynienia z liczbami zmiennoprzecinkowymi w porównaniu z ciągami.

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

To tylko przykład; wybierz odpowiednią kulturę dla swojego przypadku.

Tigran
źródło
jak mogę wybrać moje CultureInfo? Jestem w Turcji, gdzie dodam TR-TR?
Mehmet
1
@Mehmetnew System.Globalization.CultureInfo("tr-TR")
sshow
20

Możesz użyć następujących:

float asd = (float) Convert.ToDouble("41.00027357629127");
user4292249
źródło
4
Proszę podać kontekst, dlaczego jest to właściwa odpowiedź.
Bas Peeters
7

Posługiwać się Convert.ToDouble("41.00027357629127");

Convert.ToDouble dokumentacja

Ozgur Dogus
źródło
2
Czy to nie zmienia typu danych z float na double? OP chciał pływaka.
Nell Martinez
4

Dokładność liczby zmiennoprzecinkowej wynosi 7 cyfr. Jeśli chcesz zachować całą partię, musisz użyć podwójnego typu, który zachowuje 15-16 cyfr. Jeśli chodzi o formatowanie, spójrz na post o formatowaniu podwójnych . I musisz się martwić o separatory dziesiętne w C # .

jpe
źródło
Jestem zmęczony podwójnie. Częściowo zwraca 4100027357629127.0 jest szkoda
Mehmet
2
To brzmi jak „.” znak nie jest separatorem dziesiętnym w twoim języku? Sprawdź stackoverflow.com/questions/3870154/c-sharp-decimal-separator
jpe
0

Możesz double.Parse("41.00027357629127");

ABH
źródło
Myślę, że nie pyta, jak to zaokrąglić.
LUB Mapper
-2

Możesz użyć parsowania z double zamiast float, aby uzyskać większą precyzję.

Uczeń
źródło