2010-10-12 11 views

Odpowiedz

24

z pływającą-Point na Python cheat sheet:

"%.2f" % 1.2399 # returns "1.24" 
"%.3f" % 1.2399 # returns "1.240" 
"%.2f" % 1.2 # returns "1.20" 

Korzystanie round() jest niewłaściwy rzeczą do zrobienia, ponieważ pływaki są binary fractions który nie może reprezentować cyfr dziesiętnych dokładnie.

Aby wykonać obliczenia z cyframi dziesiętnymi, należy użyć typu Decimal w module decimal.

+0

Przypuśćmy, że musisz zapisać ten wynik do przyszłego użytku, czy coś takiego jak x = "%.2f "praca, czyli jak wciąż korzystasz z tych danych, zamiast po prostu je drukować (jak widziałem inne poniżej wykorzystują funkcję drukowania) EDYCJA: prawdopodobnie powinienem po prostu podążyć za twoim linkiem, przepraszam. EDYTUJ ponownie, przepraszam wciąż nie wiem jak oryginalne pytanie, które zadałam, działa z tą składnią. +1 jak na swój sposób wygląda dobrze! – onaclov2000

+0

@ onaclov2000: jak napisałem: jeśli chcesz pracować z danymi dziesiętnymi, powinieneś używać typu danych dziesiętnych zamiast spławu. –

5

Od: Python Docs rundzie (x [n]) zwróci wartość zmiennoprzecinkową x zaokrąglone na n cyfr po przecinku dziesiętnym. Jeśli n zostanie pominięte, domyślnie przyjmuje wartość zero. Wynikiem jest liczba zmiennoprzecinkowa. Wartości są zaokrąglane do najbliższej wielokrotności 10 do potęgi minus n; jeśli dwie wielokrotności są jednakowo bliskie, zaokrąglanie jest wykonywane od 0 (tak na przykład runda (0,5) wynosi 1,0, a runda (-0,5) wynosi -1,0).

Uwaga Zachowanie funkcji round() dla elementów pływających może być zaskakujące: na przykład runda (2.675, 2) daje 2,67 zamiast oczekiwanego 2,68. Nie jest to błąd: wynika to z faktu, że większość ułamków dziesiętnych nie może być przedstawiana dokładnie jako liczba zmiennoprzecinkowa. Zobacz Arytmetyka zmiennoprzecinkowa: Problemy i ograniczenia, aby uzyskać więcej informacji.

Wygląda rundzie (293.466 .... [2]), by to zrobić,

+1

@Shane: nie, tak naprawdę nie jest. –

1

x = round(293.4662543, 2)

13

Jeśli chcesz numer, użyj round() funkcję:

>>> round(12.3456, 2) 
12.35 

(ale +1 dla odpowiedzi Michaela o typie Decimal).

Jeśli chcesz ciąg:

>>> print "%.2f" % 12.34567 
12.35 
0

Jeśli potrzebujesz numery jak 2.3k lub 12M, funkcja ta spełnia swoje zadanie:

def get_shortened_integer(number_to_shorten): 
    """ Takes integer and returns a formatted string """ 
    trailing_zeros = floor(log10(abs(number_to_shorten))) 
    if trailing_zeros < 3: 
     # Ignore everything below 1000 
     return trailing_zeros 
    elif 3 <= trailing_zeros <= 5: 
     # Truncate thousands, e.g. 1.3k 
     return str(round(number_to_shorten/(10**3), 1)) + 'k' 
    elif 6 <= trailing_zeros <= 8: 
     # Truncate millions like 3.2M 
     return str(round(number_to_shorten/(10**6), 1)) + 'M' 
    else: 
     raise ValueError('Values larger or equal to a billion not supported') 

Wyniki:

>>> get_shortened_integer(2300) 
2.3k # <-- str 

>>> get_shortened_integer(1300000) 
1.3M # <-- str 
0

Mam nadzieję, że to pomoże.

def do(*args): 
    formattedList = [float("{:.2f}".format(num)) for num in args] 
    _result =(sum(formattedList)) 
    result = round(_result,2) 
    return result 


print(do(23.2332,45.24567,67,54.27)) 

Wynik:

189.75 
Powiązane problemy