将小数转换为 Python 中 1/4 的数学倍数

Convert decimal to a mathematical multiple fractions of 1/4 in Python

我想根据体重计算罩杯尺寸。 一杯定义为 240 克重量。 我需要以 1/4 的数学倍数得到 gr(十进制数)中重量 x 的杯数。 结果应该是一个字符串。

因此,可能的值应限制为: 0、1/4、1/2、3/4、1、1 1/4、1 1/2、1 3/4、2 等等。

示例:

x = 130.3

cup_size: 1/2

x = 10

cup_size: 0

x = 310

cup_size: 1 1/4

如何在 python 中实现它? 我正在阅读 Fractions 模块,但找不到我需要的内容。

应 Nathaniel 的要求,我不确定如何解决 python 中的数学问题。我认为它可以在库中存在一种方法来做到这一点。这就是我在这里问的原因。

到目前为止,我尝试的是使用 as_integer_ratio 方法进行转换:

weight = 351
unit = 240
weight_to_convert = int(round(weight/unit))
print(weight_to_convert.as_integer_ratio())

但这不起作用,只是给我最接近的整数分数的值。

以下内容可能会助您一臂之力:

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'

部分文档:

这个问题的核心是您试图 'bucket' 将可变数量的克放入一定数量的四分之一杯中,保持离散单位并避免浮动。

直接进入这个问题的核心,而不是试图确定如何处理任何除法的小数余数,您应该只问在任何给定数量中有多少四分之一杯:

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"

如果您需要更抽象地处理分数,使用分数 class 是有意义的 - 但乘以除数的技巧(在本例中为四,因为四分之一杯是您的最小单位)得到你的非浮动价值。您可以放弃剩余部分。