#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