2017-02-27 80 views
8

W języku Python, w jaki sposób można wydrukować liczbę, która może być liczbą całkowitą lub rzeczywistą, kiedy ten ostatni przypadek wymagałby ograniczenia mojego wydruku do pewnej liczby cyfr?Wydrukuj liczbę całkowitą lub liczbę zmiennoprzecinkową za pomocą liczby n dziesiętnej

Krótko mówiąc, że mamy następujący przykład:

print("{0:.3f}".format(num)) # I cannot do print("{}".format(num)) 
          # because I don't want all the decimals 

Czy istnieje „Pythy” sposób, aby zapewnić np w przypadku num == 1 że mogę wydrukować 1 zamiast 1.000 (mam na myśli inne niż zaśmiecania mojego kodu z if sprawozdania)

+0

Częścią problemu jest to, że '' .3' int' traktuje tak samo jak 'float' robi, zamiast powiedzieć, ignorowanie go całkowicie. –

+0

Zgaduję, że nie, musiałbyś przynajmniej zrobić gdzieś po drodze operatora trójskładnikowego i jestem pewien, że policzysz to jako "jeśli". –

Odpowiedz

10

z Python 3 *, można po prostu użyć round() ponieważ oprócz zaokrąglania float s po nałożeniu na liczbę całkowitą to zawsze zwróci int:

>>> num = 1.2345 
>>> round(num,3) 
1.234 
>>> num = 1 
>>> round(num,3) 
1 

Takie zachowanie jest udokumentowana w help(float.__round__):

Help on method_descriptor: 

__round__(...) 
    Return the Integral closest to x, rounding half toward even. 
    When an argument is passed, work like built-in round(x, ndigits). 

And help(int.__round__):

Help on method_descriptor: 

__round__(...) 
    Rounding an Integral returns itself. 
    Rounding with an ndigits argument also returns an integer. 

* Z Pythonie 2, round() zawsze return s a float.

+1

Nigdy nie wiedziałem, że "runda" była tak wszechstronna. Nigdy nie przyszło mi do głowy, żeby użyć go na "int". –

+0

Nie wiem, czy ma to znaczenie, ale nie da to tego samego wyniku co specyfikacja formatu w pytaniu o krótszych wartościach zmiennoprzecinkowych (tj. '1.2' względem' 1.200'). – ekhumoro

+0

@ekhumoro Tak, zgadzam się, że nie jest całkiem jasne, jakie jest pożądane zachowanie, odmówiłem waszego rozwiązania –

1

Jeśli używasz szereg poprawek z zmiennoprzecinkowych, można po prostu użyć zastąpić usunąć dodatkową 0. Na przykład będzie to rade:

print("{:.3f}".format(1).replace(".000", "")) 
+0

Działa świetnie, chyba że wymaganiem jest wyświetlenie '1.0' jako' 1.000'. –

4

Jeśli trzeba utrzymać stałej szerokości dla wartości float, można użyć printf-style formatting coś takiego:

>>> num = 1 
>>> print('%0.*f' % (isinstance(num, float) * 3, num)) 
1 
>>> num = 1.2345 
>>> print('%0.*f' % (isinstance(num, float) * 3, num)) 
1.234 
>>> num = 1.2 
>>> print('%0.*f' % (isinstance(num, float) * 3, num)) 
1.200