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 ...


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.


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.


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");

4
Proszę podać kontekst, dlaczego jest to właściwa odpowiedź.
Bas Peeters


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 # .


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


-2

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.