【问题标题】:Efficient way to round to arbitrary precision in Python [closed]在 Python 中四舍五入到任意精度的有效方法 [关闭]
【发布时间】:2013-10-25 21:04:36
【问题描述】:

以下问题的 Pythonic 解决方案是什么?

我正在读取分辨率为 0.5 的温度传感器。我需要写入它(它有一个可编程恒温器输出),分辨率也是 0.5。

所以我编写了这个函数(Python 2.7)来将浮点数作为输入到最接近的 .5:

def point5res(number):
    decimals = number - int(number)
    roundnum = round(number, 0)
    return roundnum + .5 if .25 <= decimals < .75 else roundnum

print point5res (6.123)

print point5res(6.25)

print point5res(6.8)

效果很好,分别输出 6.0、6.5 和 7.0。这正是我想要的。

我对 Python 比较陌生。线

return roundnum + .5 if .25 <= decimals < .75 else roundnum

让我对它的实施者钦佩流口水。但它是 Pythonic 的吗?

编辑:自从发帖以来,我对what is and isn't 'Pythonic'有了更多的了解。我的代码不是。下面是 Cmd 的答案。谢谢!

【问题讨论】:

  • 我想一般是负值
  • 试试 6.51。结果是 7.5。但你是对的,链式比较是一个很棒的功能。三元表达式语法,一旦你“得到”它,也非常好。
  • 那个 6.51 的结果很有趣
  • 有些人可能会嘲笑它不那么可读,但大多数 C 系列语言都采用三元语句的形式。例如,在 JavaScript、Java、C# 和其他一些语言中:return 0.25 &lt;= decimals &lt; 0.75 ? roundnum + 0.5 : roundnum;
  • 我认为这个问题应该重新命名为:“在 Python 中四舍五入到任意精度的有效方法”或类似的东西。这不是真正的 x 或 y 问题。

标签: python if-statement


【解决方案1】:

如果你保持表达式简单,它们就会被认为是 Pythonic,否则就会变得难以阅读。

我会像这样四舍五入到最接近的 0.5:

round(number*2) / 2.0

或更笼统地说:

def roundres(num, res):
    return round(num / res) * res

【讨论】:

  • 与 OP 给出的示例相比,这不会返回相同的值。这是返回整数(尝试 6.25)
  • @CDspace 原来的有问题,这就是我发布替代方案的原因。此外,在浮点数上比较 == 不会按预期运行。
  • 请注意 round() 在 Python 2 和 Python 3 之间改变了它的行为。round(0.5) 在 Python 2 中是 1 在 Python 3 中是 0。所以这个解决方案只适用于 Python 2. OP 使用的是什么,所以 +1
  • @cmd 我用 Python 3.3 测试过,在测试 6.25 时返回 6,我的错
  • +1。更多的 pythonic 做round(number*2) / 2.0 而不是三行代码
【解决方案2】:
return 0.5 * divmod (number, 0.5) [0] if number >= 0 else -0.5 divmod (number, -0.5) [0]

这看起来更好:

def roundToHalf (number):
    ''' Round to nearest half '''
    half = 0.5 if number >= 0 else -0.5
    return half * divmod (number, half) [0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2013-07-22
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多