#python #fractions
Вопрос:
Я хочу вычислить размер чашки на основе веса. Одна чашка определяется как вес 240 грамм. Мне нужно получить количество чашек веса x
в гр (десятичное число), в математической кратной доле 1/4
. Результатом должна быть строка.
Таким образом, возможные значения должны быть ограничены: 0, 1/4, 1/2, 3/4, 1, 1 1/4, 1 1/2, 1 3/4, 2 и так далее.
Примеры:
x = 130.3
размер чашки: 1/2
x = 10
размер чашки: 0
x = 310
размер чашки: 1 1/4
Как я могу реализовать это в python? Я читал модуль Дробей, но не могу найти то, что мне нужно.
Как просил Натаниэль, я не уверен, как решить эту математическую задачу на python. Я думаю, что для этого может существовать метод в библиотеке. Вот почему я спрашиваю здесь.
До сих пор я пытался преобразовать с as_integer_ratio
помощью метода:
weight = 351
unit = 240
weight_to_convert = int(round(weight/unit))
print(weight_to_convert.as_integer_ratio())
Но это не работает, просто дает мне значение как ближайшую целочисленную дробь.
Комментарии:
1. Вам нужны выходные данные в виде строк или реальных объектов дроби? Вы не должны использовать объекты с плавающей запятой, так как они имеют ошибки округления
2. Вывод должен быть строкой
3. Вы должны предоставить какой-то код, который вы пробовали, и объяснить, почему он работает не так, как ожидалось. Как бы то ни было, вы как бы просите, чтобы я просто закодировал это для вас.
4. Начнем с
round(amount / 240, 3)
этого . Затем напишите функцию для округления до ближайшей четверти чашки5. @NathanielFord Я не знаю, как решить эту проблему. Я добавил то, что пробовал до сих пор.
Ответ №1:
Следующее может подтолкнуть вас в правильном направлении:
def cups(val):
full, quarter = divmod(val // 60, 4)
if not (full or quarter):
return "0"
f = f"{full:.0f}" if full else ""
if quarter:
if quarter == 2:
f = " 1/2"
else:
f = f" {quarter:.0f}/4"
return f.strip()
>>> cups(130)
'1/2'
>>> cups(310)
'1 1/4'
>>> cups(10)
'0'
Некоторые документы:
Комментарии:
1. Это точное решение вопроса. Магия заключается в методе divmod. Спасибо пользователю 2390182!!!!!
Ответ №2:
Суть этой проблемы заключается в том, что вы пытаетесь «зачерпнуть» переменное количество граммов в некоторое количество четвертных чашек, сохраняя дискретные единицы и избегая поплавков.
Переходя прямо к сути этой проблемы, вместо того, чтобы пытаться определить, что делать с дробным остатком от любого деления, вы должны просто спросить, сколько четвертных чашек в любом заданном количестве:
quarters = val / (240 / 4) # Alternatively, (val * 4) / 240) or val / 60
Теперь вопрос в определении остатка на четверых.
cups = quarters // 4
quotient = quarters % 4
Вышесказанное получает чашки и четверть чашки. Теперь мы печатаем:
if quotient == 0: # Here there is no fraction
f"cup_size = {cups}"
elif quotient == 2: # In this case we need to reduce the fraction
"cup_size = {} {} / 2".format(cups, quotient / 2)
else:
f"cup_size = {cups} {quotient} / 4"
Если вам нужно более абстрактно обрабатывать дроби, использование класса дробей имело бы смысл, но трюк умножения на ваш делитель (в данном случае на четыре, потому что четверть чашки — это ваша наименьшая единица) дает вам значение в неплавающих терминах. Вы можете отбросить остальное.