Otrzymuję wiele miejsc po przecinku w wyniku tego kodu (konwerter Fahrenheita na Celsjusza).
Mój kod obecnie wygląda następująco:
def main():
printC(formeln(typeHere()))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
except ValueError:
print "\nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
Fahrenheit = 50
return Fahrenheit
def formeln(c):
Celsius = (Fahrenheit - 32.00) * 5.00/9.00
return Celsius
def printC(answer):
answer = str(answer)
print "\nYour Celsius value is " + answer + " C.\n"
main()
Więc moje pytanie brzmi: jak sprawić, by program zaokrąglał każdą odpowiedź do drugiego miejsca po przecinku?
Odpowiedzi:
Możesz użyć
round
funkcji, która jako pierwszy argument przyjmuje liczbę, a drugi argument to precyzja po przecinku.W twoim przypadku byłoby to:
źródło
round()
for floats może być zaskakujące: na przykładround(2.675, 2)
daje2.67
zamiast oczekiwanego2.68
. ”round(2.675, 2)
daje,2.67
a nie2.68
ma nic wspólnego z zaokrąglaniem Bankera.Korzystanie
str.format()
„s składni do wyświetlaniaanswer
z dwoma miejscami po przecinku (bez zmiany wartości podstawowej oanswer
):Gdzie:
:
wprowadza specyfikację formatu0
włącza znakowanie zerami dla typów numerycznych.2
ustawia precyzję na2
f
wyświetla liczbę jako liczbę stałoprzecinkowąźródło
0.5357...
jest bliżej0.54
niż do0.53
, więc zaokrąglanie0.54
ma sens."{:0.2f}".format(1.755)
-> 1,75"{:0.2f}".format(1.7551)
-> 1,76 - Jednak oczekiwałbym obu równości 1,76.Większość odpowiedzi sugerowanych
round
lubformat
.round
czasami zaokrągla w górę, aw moim przypadku potrzebowałem zaokrąglenia wartości mojej zmiennej, a nie tylko jej wyświetlania.Znalazłem odpowiedź tutaj: jak zaokrąglić liczbę zmiennoprzecinkową do pewnego miejsca po przecinku?
lub:
źródło
round(2.354, 2) # -> 2.35
10**d
zamiastint('1' + ('0' * d))
.źródło
Chcesz zaokrąglić swoją odpowiedź.
round(value,significantDigit)
jest zwykłym rozwiązaniem tego problemu, jednak czasami nie działa to tak, jak można by się tego spodziewać z perspektywy matematycznej, gdy cyfra bezpośrednio gorsza (na lewo od) cyfry, którą zaokrąglasz, ma5
.Oto kilka przykładów tego nieprzewidywalnego zachowania:
Zakładając, że Twoim celem jest wykonanie tradycyjnego zaokrąglania dla statystyk w nauce, jest to przydatne opakowanie, aby
round
funkcja działała zgodnie z oczekiwaniami i wymagałaimport
dodatkowych rzeczyDecimal
.Aha! Na tej podstawie możemy wykonać funkcję ...
Zasadniczo dodaje to naprawdę niewielką wartość do łańcucha, aby zmusić go do poprawnego zaokrąglenia w górę w nieprzewidywalnych przypadkach, w których zwykle nie działa z
round
funkcją, gdy się tego spodziewasz. Wygodną wartością do dodania jest to,1e-X
gdzieX
jest długość ciągu liczbowego, którego próbujesz użyćround
na plus1
.Podejście polegające na użyciu
10**(-len(val)-1)
było celowe, ponieważ jest to największa mała liczba, jaką można dodać, aby wymusić przesunięcie, jednocześnie zapewniając, że dodana wartość nigdy nie zmienia zaokrąglenia, nawet jeśli.
brakuje dziesiętnego . Mógłbym użyć tylko10**(-len(val))
warunku,if (val>1)
aby odjąć1
więcej ... ale łatwiej jest po prostu zawsze odjąć,1
ponieważ nie zmieni to zbytnio odpowiedniego zakresu liczb dziesiętnych, które to obejście może poprawnie obsłużyć. To podejście zakończy się niepowodzeniem, jeśli twoje wartości osiągną granice danego typu, to się nie powiedzie, ale dla prawie całego zakresu prawidłowych wartości dziesiętnych powinno działać.Tak więc gotowy kod będzie podobny do:
... powinien dać oczekiwane rezultaty.
Aby to zrobić, możesz również użyć biblioteki dziesiętnej , ale proponuję opakowanie jest prostsze i może być preferowane w niektórych przypadkach.
Edit: Dzięki Blckknght dla wskazując, że
5
sprawa frędzle występuje tylko dla pewnych wartości tutaj .źródło
Wystarczy użyć formatowania z% .2f, co daje zaokrąglenie w dół do 2 miejsc po przecinku.
źródło
Możesz użyć operatora formatowania łańcucha w pythonie „%”. „% .2f” oznacza 2 cyfry po przecinku.
http://docs.python.org/2/library/stdtypes.html#string-formatting
źródło
Można użyć operatora okrągłego z dokładnością do 2 miejsc po przecinku
źródło
Możesz użyć funkcji okrągłej.
da ci odpowiedź 80.234
W twoim przypadku użyj
źródło
Jeśli chcesz uniknąć problemu z liczbą zmiennoprzecinkową przy zaokrąglaniu liczb do rozliczania, możesz użyć rundy numpy.
Musisz zainstalować numpy:
i kod:
odciski
Powinieneś tego użyć, jeśli zarządzasz pieniędzmi za pomocą legalnego zaokrąglania.
źródło
Oto przykład, którego użyłem:
źródło
Nie jestem pewien dlaczego, ale format „{: 0.2f}” (0,5357706) daje mi „0,54”. Jedyne rozwiązanie, które działa dla mnie (python 3.6), jest następujące:
źródło
Jak chcesz swoją odpowiedź w liczbach dziesiętnych, więc nie musisz zapisywać zmiennej odpowiedzi do str w funkcji printC ().
a następnie użyj formatowania ciągów w stylu printf
źródło
Odpowiedź pochodzi z: https://stackoverflow.com/a/29651462/8025086
źródło