Преобразуйте десятичную дробь в математическую кратную 1/4 в Python

#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"
 

Если вам нужно более абстрактно обрабатывать дроби, использование класса дробей имело бы смысл, но трюк умножения на ваш делитель (в данном случае на четыре, потому что четверть чашки — это ваша наименьшая единица) дает вам значение в неплавающих терминах. Вы можете отбросить остальное.