Python – как округлить до двух десятичных знаков

Я получаю много десятичных знаков на выходе этого кода (преобразователь по Фаренгейту в Цельсию).

В настоящее время мой код выглядит следующим образом:

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() 

Итак, мой вопрос: как мне успешно сделать программу округленным до каждого десятизначного числа?

9 Solutions collect form web for “Python – как округлить до двух десятичных знаков”

Вы можете использовать круглую функцию, которая принимает в качестве первого аргумента число, а второй аргумент – точность.

В вашем случае это будет:

 answer = str(round(answer, 2)) 

Использование синтаксиса str.format() для отображения answer с двумя десятичными знаками (без изменения базового значения answer ):

 def printC(answer): print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer) 

Где:

  • : вводит спецификацию формата
  • 0 позволяет значить нулевое дополнение для числовых типов
  • .2 задает точность 2
  • f отображает номер в виде номера с фиксированной запятой

Просто используйте форматирование с% .2f, которое дает округление до 2 десятичных знаков.

 def printC(answer): print "\nYour Celsius value is %.2f C.\n" % answer 
 float(str(round(answer, 2))) float(str(round(0.0556781255, 2))) 

Вопрос помечен как «как округлить до двух десятичных знаков»

round всегда округляет вверх

 round(2.357, 2) # -> 2.36 

Я нашел истинный ответ здесь: Как округлить плавающее число?

 import math v = 2.357 print(math.ceil(v*100)/100) # -> 2.36 print(math.floor(v*100)/100) # -> 2.35 

или:

 from math import floor def roundDown(n, d=8): d = int('1' + ('0' * d)) return floor(n * d) / d 

Вы можете использовать оператор форматирования строк для python «%». «% .2f» означает 2 цифры после десятичной точки.

 def typeHere(): 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(Fahrenheit): Celsius = (Fahrenheit - 32.0) * 5.0/9.0 return Celsius def printC(answer): print "\nYour Celsius value is %.2f C.\n" % answer def main(): printC(formeln(typeHere())) main() 

http://docs.python.org/2/library/stdtypes.html#string-formatting

Поскольку вы хотите, чтобы ваш ответ был десятичным, поэтому вам не нужно приводить переменную answer к переменной str в функции printC ().

а затем использовать форматирование строк в стиле printf

Вы можете использовать круглую функцию.

 round(80.23456, 3) 

даст вам ответ 80.234

В вашем случае используйте

 answer = str(round(answer, 2)) 

Надеюсь это поможет 🙂

Вы хотите округлить свой ответ.

round(value,significantDigit) является обычным решением для этого, однако иногда это не работает, как можно было бы ожидать из математической точки зрения, когда цифра, непосредственно уступающая (слева), цифра, которую вы округливаете, имеет значение 5 .

Вот несколько примеров этого непредсказуемого поведения:

 >>> round(1.0005,3) 1.0 >>> round(2.0005,3) 2.001 >>> round(3.0005,3) 3.001 >>> round(4.0005,3) 4.0 >>> round(1.005,2) 1.0 >>> round(5.005,2) 5.0 >>> round(6.005,2) 6.0 >>> round(7.005,2) 7.0 >>> round(3.005,2) 3.0 >>> round(8.005,2) 8.01 

Предполагая, что ваша цель состоит в том, чтобы сделать традиционное округление статистики в науках, это удобная оболочка, чтобы получить round функцию, работающую как ожидалось, чтобы import дополнительные вещи, такие как Decimal .

 >>> round(0.075,2) 0.07 >>> round(0.075+10**(-2*6),2) 0.08 

Ага! Поэтому на основе этого мы можем сделать функцию …

 def roundTraditional(val,digits): return round(val+10**(-len(str(val))-1)) 

В основном это добавляет очень маленькое значение в строку, чтобы заставить ее округлить себя должным образом в непредсказуемых случаях, когда она обычно не работает с round функцией, когда вы этого ожидаете. Удобное значение для добавления: 1e-X где X – длина числовой строки, которую вы пытаетесь использовать round on plus 1 .

Подход к использованию 10**(-len(val)-1) был преднамеренным, так как он является самым большим небольшим числом, которое вы можете добавить, чтобы заставить сдвиг, а также гарантируя, что добавленное вами значение никогда не изменяет округление, даже если оно равно десятичному значению . пропал, отсутствует. Я мог бы использовать только 10**(-len(val)) с условием if (val>1) чтобы вычесть еще 1 … но проще просто вычесть 1 как это не изменит диапазон применимого диапазона десятичные числа, которые этот способ обхода может корректно обрабатывать. Этот подход не удастся, если ваши значения достигнут пределов типа, это не удастся, но для почти полного диапазона действительных десятичных значений он должен работать.

Таким образом, готовый код будет выглядеть примерно так:

 def main(): printC(formeln(typeHere())) def roundTraditional(val,digits): return round(val+10**(-len(str(val))-1)) 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(roundTraditional(answer,2)) print "\nYour Celsius value is " + answer + " C.\n" main() 

… должен дать вам ожидаемые результаты.

Вы также можете использовать десятичную библиотеку для этого, но предлагаемая оболочка проще и в некоторых случаях может быть предпочтительнее.


Edit: Спасибо Blckknght за указание, что случай с пятью краями встречается только для определенных значений здесь .

Python - лучший язык программирования в мире.