Konwertuj liczbę zmiennoprzecinkową na określoną dokładność, a następnie skopiuj do łańcucha

144

Powiedzmy, że mam liczbę zmiennoprzecinkową 135.12345678910. Chcę połączyć tę wartość z ciągiem, ale chcę tylko 135.123456789. Dzięki drukowaniu mogę to łatwo zrobić, wykonując coś takiego:

print "%.9f" % numvar

z numvarczym mój oryginalny numer. Czy jest na to łatwy sposób?

pauliwago
źródło
3
% dokładnie to robi -% nie jest częścią funkcji print, ale ciągiem znaków - zobacz dokumentację Pythona
michael_s

Odpowiedzi:

177

W Pythonie <3 (np. 2.6 [patrz komentarze] lub 2.7) można to zrobić na dwa sposoby.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Należy jednak pamiętać, że w przypadku wersji Pythona powyżej 3 (np. 3.2 lub 3.3) preferowana jest opcja druga .

Aby uzyskać więcej informacji na temat opcji drugiej, sugeruję ten link na temat formatowania ciągów z dokumentacji Pythona .

Aby uzyskać więcej informacji na temat opcji pierwszej, ten link wystarczy i zawiera informacje o różnych flagach .

Python 3.6 (oficjalnie wydany w grudniu 2016 r.), Dodał fdosłowny ciąg znaków, zobacz więcej informacji tutaj , co rozszerza str.formatmetodę (użycie nawiasów klamrowych w taki sposób, że f"{numvar:.9f}"rozwiązuje pierwotny problem), czyli

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

rozwiązuje problem. Sprawdź odpowiedź @ Or-Duan, aby uzyskać więcej informacji, ale ta metoda jest szybka .

HAL 9001
źródło
1
opcja druga powinna być newer_method_string = "{:.9f}".format(numvar)- zwróć uwagę na konieczność :oddzielenia pola i formatowania. I tak przetestowałem to w wersji 2.7.5.
Caltor
1
Dla Pythona 2.6 opcja druga powinna być newer_method_string = "{0:.9f}".format(numvar)- zwróć uwagę na wymagane 0 dla nazwa_pola dla tej starszej wersji.
ttq
56

Python 3.6.0

Żeby było jasne, możesz użyć formatowania f-stringów . Ma prawie taką samą składnię jak formatmetoda, ale czyni ją nieco ładniejszą.

Przykład:

print(f'{numvar:.9f}')

Więcej informacji na temat nowego ciągu f:

Oto diagram czasów wykonania różnych testowanych metod (z ostatniego linku powyżej):

czasy realizacji

Albo Duan
źródło
52

Używając round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
shantanoo
źródło
8

To nie print wykonuje formatowanie, jest to właściwość ciągów, więc możesz po prostu użyć

newstring = "%.9f" % numvar
John La Rooy
źródło
Lub użyj nowego formatowania stylu. valueString = "{:. 9f}". format (liczba)
Zaren
8

W przypadku, gdy dokładność nie jest znana przed uruchomieniem, ta inna opcja formatowania jest przydatna:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
Yu Hao
źródło
3
Jeśli wolisz używać .format-method pamiętać, że może to być również wykonane przez lęgowych argumentów tak: '{:.{n}f}'.format(numvar,n=n).
nivk
2

Aby ustawić precyzję za pomocą 9 cyfr, pobierz:

print "%.9f" % numvar

Precyzja zwrotu z 2 cyframi:

print "%.2f" % numvar 

Zwróć precyzję z 2 cyframi i zmiennoprzecinkową wartością przekonwertowaną:

numvar = 4.2345
print float("%.2f" % numvar) 
Tejas Tank
źródło
-2

strFunkcja ma błąd. Spróbuj wykonać następujące czynności. Zobaczysz „0,196553”, ale prawidłowe wyjście to „0,196554”. Ponieważ strdomyślną wartością funkcji jest ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")
ethemsulan
źródło
2
O co chodzi z .vs. ,? A jakie to ma znaczenie dla pytania Pauliwago?
Peter Mortensen,