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?


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 .


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


52

Używając round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

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

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'

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) 

-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(".", ",")

2
O co chodzi z .vs. ,? A jakie to ma znaczenie dla pytania Pauliwago?
Peter Mortensen,
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.