почему выходные данные для этих двух эквивалентных функций различны?

#python #python-3.x #if-statement #math

Вопрос:

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

Вот вопрос: из ежемесячного дохода арендатора арендодатель получает 5% от первых от 0 до 9999 долларов 10% от оставшихся от 10 до 19999 долларов 15% от оставшихся от 20 до 49999 долларов 20% от оставшихся от 50 до 99999 долларов 30% от оставшихся 100000 долларов и выше. Узнайте, сколько арендной платы арендатору придется заплатить в этом месяце, если его ежемесячный доход составлял 23 000 долларов.

 def calculate_rent_1(renter_salary):  rent = 0  if renter_salary gt; 0:  if renter_salary lt;= 9999:  return 0.05 * renter_salary  else:  rent  = 0.05 * 9999  renter_salary -= 9999   if renter_salary gt; 9999:  if renter_salary lt;= 19999:  return rent   0.1 * renter_salary  else:  rent  = 0.1 * 9999  renter_salary -= 9999    if renter_salary gt; 19999:  if renter_salary lt;= 49999:  return rent   0.15 * renter_salary  else:  rent  = 0.15 * 29999  renter_salary -= 29999    if renter_salary gt; 49999:  if renter_salary lt;= 99999:  return rent   0.2 * renter_salary  else:  rent  = 0.2 * 49999  renter_salary -= 49999    if renter_salary gt; 99999:  return rent   0.3 * renter_salary   def calculate_rent_2(renter_salary):  if not renter_salary: return 0  rent = 0  if 100000 lt;= renter_salary:  rent  = 0.3 * (renter_salary - 100000)  renter_salary = 99999  if 50000 lt;= renter_salary:  rent  = 0.2 * (renter_salary - 50000)  renter_salary = 49999  if 20000 lt;= renter_salary:  rent  = 0.15 * (renter_salary - 20000)  renter_salary = 19999  if 10000 lt;= renter_salary:  rent  = 0.1 * (renter_salary - 10000)  renter_salary = 9999  if 0 lt; renter_salary:  rent  = 0.05 * renter_salary    return rent  print("Output from calculate_rent_1:", calculate_rent_1(23000)) # output: 1800.0500000000002 print("Output from calculate_rent_2:", calculate_rent_2(23000)) # output: 1949.8500000000001  

Комментарии:

1. Вы пробовали отлаживать это самостоятельно ? Отладка — невероятно ценный навык, и чем раньше вы начнете учиться, тем больше пользы получите.

Ответ №1:

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

 rent = 0  if renter_salary gt; 0:  if renter_salary lt;= 9999:  return 0.05 * renter_salary  else:  rent  = 0.05 * 9999  renter_salary -= 10000   print( rent, renter_salary)  if renter_salary gt; 9999:  if renter_salary lt;= 19999: ##lt;lt;lt;lt;lt;lt;  return rent   0.1 * renter_salary  else:  rent  = 0.1 * 9999  renter_salary -= 10000  

В отмеченной строке вы проверяете зарплату Это нужно проверить на 9999. То же самое повторяется и в других предложениях.

Комментарии:

1. Спасибо! Ваш совет помог мне скорректировать мой подход к calculate_rent_1, а также изменить верхние границы для calculate_rent_2. Выходные данные теперь отличаются на 0,05, когда в качестве входных данных передается 23000 долларов. Я написал свой ответ ниже.

2. В этом разница между вычитанием 9999, как вы делаете в первой функции, и вычитанием 10000, как вы делаете во второй функции.

3. Спасибо. Кажется, я понимаю, что ты имеешь в виду. Вы имеете в виду мое вычитание 9999 из renter_salary в первой функции, но присвоение 9999 renter_salary во второй? Оба подхода имеют для меня смысл, потому что я хочу, чтобы 100 000 долларов были в другой категории, чем 99999 долларов, и аналогично для меньших чисел. Если вы видите подход, который дает один и тот же ответ для обоих, пожалуйста, дайте мне знать, так как это побудит меня к дальнейшей отладке.

4. Проработайте это с 15000. В первом случае вы берете 5% от 9999 плюс 10% от (15000-9999). Во втором случае вы берете 5% от 9999 плюс 10% от (15000-10000).

Ответ №2:

Вот мой ответ после исправления моего подхода для calculate_rent_1 и изменения верхних границ для calculate_rent_2. Причина последнего заключается в том, что, если арендная плата составляет 100 000 долларов, я бы хотел включить в арендную плату 0,3% от 1 доллара, что превышает 99 999 долларов.

 def calculate_rent_1(renter_salary):  if not renter_salary: return 0  rent = 0   if (renter_salary - 9999) lt;= 0:  return 0.05 * rent    rent  = 0.05 * 9999  renter_salary -= 9999   if (renter_salary - 9999) lt;= 0:  return rent   0.1 * renter_salary    rent  = 0.1 * 9999  renter_salary -= 9999   if (renter_salary - 29999) lt;= 0:  return rent   0.15 * renter_salary    rent  = 0.15 * 29999  renter_salary -= 29999   if (renter_salary - 49999) lt;= 0:  return rent   0.2 * renter_salary    rent  = 0.2 * 49999  renter_salary -= 49999   if renter_salary gt; 0:  return rent   0.3 * renter_salary    return rent  def calculate_rent_2(renter_salary):  if not renter_salary: return 0  rent = 0   if 100000 lt;= renter_salary:  rent  = 0.3 * (renter_salary - 99999)  renter_salary = 99999   if 50000 lt;= renter_salary:  rent  = 0.2 * (renter_salary - 49999)  renter_salary = 49999   if 20000 lt;= renter_salary:  rent  = 0.15 * (renter_salary - 19999)  renter_salary = 19999   if 10000 lt;= renter_salary:  rent  = 0.1 * (renter_salary - 9999)  renter_salary = 9999   if 0 lt;= renter_salary:  rent  = 0.05 * renter_salary    return rent  print("Output from calculate_rent_1:", calculate_rent_1(23000)) # output: 1950.15 print("Output from calculate_rent_2:", calculate_rent_2(23000)) # output: 1950.1000000000001