【问题标题】:rounding values in PythonPython中的舍入值
【发布时间】:2017-03-07 02:18:38
【问题描述】:

我正在编写一个从十进制到分数英寸的小型“转换”脚本。因此 1.535 英尺转换为 1' - 6 7/16" 的字符串。 我已经解决了所有英尺和英寸的问题,但是在对英寸的小数部分进行四舍五入时遇到了问题。

我的部分代码是:

F = 0.336 # This is the value that I get for decimal part of inches: if it is 0, the w = '0"' if it 0.999 is w = '31/32"' 
w = '0"'
if F == 0:
    w = '0"'
elif  0 < F <= 0.03125: #1/32"
    w = '1/32"'
elif 0.03125 < F <= 0.0625: #2/32"
    w = '2/32"'
elif 0.0625 < F <= 0.09375: #3/32"
    w = '3/32"'
elif 0.09375 <  F <= 0.125: #4/32"
    w = '4/32"'
elif 0.125 < F <= 0.15625: #5/32"
    w = '5/32"'

# .etc until 32/32"

print(w)

问题是我的print(w) 将始终导致0 无论F 的值是多少

帮助不胜感激!

【问题讨论】:

  • 请包含您的所有代码。您正在寻求帮助以查找错误,但隐藏了应处理 0.336 值的代码。
  • w = '5/32" 后面少了一个单引号。
  • 为什么要手动转换,而不是使用fractions 模块?
  • 也许这会更容易维护为 while 循环,其中您的聚合数字从 0 开始并增加要检查的值 0.03125 并继续检查您的数字是否较小大于或等于它。
  • @Austin - 我无法发布整个代码。抱怨的时间太长了。任何建议,我如何发布它?谢谢!

标签: python


【解决方案1】:

if else 梯形图检查条件可能有问题。如果不满足任何条件,则 w 的值不会在任何 if else 阶梯中修改。因此 w 的初始化值只用 print(w) 打印出来。

【讨论】:

  • 您可以通过将 w 的初始值设置为类似 2" 来测试这个理论
  • 抱歉,我无法发布整个脚本。抱怨“太长......”我该如何解决这个问题并发布整个脚本?谢谢。
  • 他们建议在分数代码的顶部设置w = '2"'。然后,如果结果是 2",你就知道你的 if ... elif ... else 代码没有被执行。
【解决方案2】:

如果没有您的完整代码,我们将无法调试您的问题,尤其是因为正在执行的路径似乎在您未包含的代码部分中。

除此之外,您似乎应该能够从 python 标准库中的 fractions 模块中获得您想要的结果(正如@Vallentin 所提到的)。

您的代码可以简化为:

from fractions import Fraction
F = 0.336
as_fraction = Fraction(F).limit_denominator(32)
print(as_fraction.numerator, "/", as_fraction.denominator)

如果你想play around with it

【讨论】:

  • 抱歉没有发布整个代码。我正在尝试发布它,但给我一个错误“太长了......”下面是我可以发布的数量。 w = '0"' 如果 0
  • 感谢您提出分数,但不幸的是,这给了我 F = 0.271 的 3 / 11 分数。由于此脚本适用于建筑行业,它们使用 1/32" 或 1/16" 或 1/8" 等值。所以所有分数都应该是其中一个的倍数。那是我“手动”设置公差。感谢您的帮助!
  • @alc,我发布了另一个应该满足您的限制的答案,但我想留下这个答案,以防其他人只想要分数而不关心分母是什么。
【解决方案3】:

在python中使用十进制,而不是简单的x/y

    import decimal
    alist = [1,2,3,4,5]
    blist = [32,32,32,32,32]

    for x, y in zip(alist, blist):
        print '{0}/{1} = {2},{3}'.format(x,  y, x/y, decimal.Decimal(x)/decimal.Decimal(y) )

结果是:

1/32 = 0, using decimal 0.03125
2/32 = 0, using decimal 0.0625
3/32 = 0, using decimal 0.09375
4/32 = 0, using decimal 0.125
5/32 = 0, using decimal 0.15625

【讨论】:

    【解决方案4】:

    鉴于您需要一个特定的分母,您似乎必须自己编写转换逻辑,以便您可以选择如何处理舍入。似乎您有一个无法识别的小错误,这通常发生在大段重复代码中。您可以通过循环执行转换来减少潜在的错误。下面是一个示例函数,应该可以实现您想要的转换行为:

    def to_fraction(decimal, denominator):
      """ Converts a decimal value to a fraction with a given denominator
    
      If between exact fractions we round up """
    
      multiplier = 1 / denominator
      numerator = 0
    
      while decimal > numerator*multiplier:
        numerator += 1
    
      return str(numerator) + "/" + str(denominator)
    
    F = 0.336
    print(to_fraction(F, 32))
    

    您可以在 repl.it 上使用它:convert to_fraction

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2015-12-11
      • 2012-08-12
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多