如何将 float 0.5 舍入到 1.0,同时仍然将 0.45 舍入到 0.0,就像通常的学校舍入一样?

新手上路,请多包涵

似乎默认的 Python round(1 / 2) 给出 0。

如何将 float 0.5 舍入到 1.0,同时仍然将 0.45 舍入到 0.0,就像通常的学校舍入一样?

注意:很抱歉删除并再次发布它,但它被错误地标记为另一个问题的重复项。

原文由 EquipDev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 652
2 个回答

实际上目前认为不盲目地将 *.5 向上舍入是合适的。相反,将 *.5 舍入到最接近的偶数是合适的。 Python 3 实现了这种“适当”形式的“银行家舍入”,但许多其他语言(还)没有。盲目向上舍入 *.5 会产生轻微偏差,但“银行家舍入”有助于平衡它。有关详细信息,请参阅 此线程。所以…

方法一

您可以有条件地使用 ceil(...) 函数(来自 数学模块 的舍入方面。您必须有条件地执行此操作,以便还保持小于 0.5 的值的常规舍入行为。尝试类似以下内容(请注意,这不是非常可靠,因为它只适用于正值……不过它应该能够很容易地适应正值和负值):

 import math

val = 1.5
x = 0

if (float(val) % 1) >= 0.5:
    x = math.ceil(val)
else:
    x = round(val)

请注意 ceil(...) 函数将返回一个整数,而不是一个浮点数。这不应该是一个主要问题,但现在你知道了。

方法二

从我上面链接的帖子来看,另一种选择似乎是使用 decimal 模块来模拟舍入行为的“旧”方式。我有点从那里复制和粘贴,但在这里你去:

 import decimal

x = decimal.Decimal('1.5').quantize(decimal.Decimal('1'),
rounding=decimal.ROUND_HALF_UP)

据说 decimal.ROUND_HALF_UP 舍入形式就是您要找的。这样您就不必有条件地使用 ceil(...) 函数。

我猜这被标记为另一个的重复,因为稍微挖掘一下就会为您提供关于该主题的足够多的信息。 (我没有将其标记为重复,我只是假设这就是其他人这样做的原因。)

原文由 Luke Hollenback 发布,翻译遵循 CC BY-SA 3.0 许可协议

获取“学校”四舍五入,中间值从 0 开始四舍五入,对于负数也可以使用下面的函数。这也是 Python 2 中的舍入。

 def round_school(x):
    i, f = divmod(x, 1)
    return int(i + ((f >= 0.5) if (x > 0) else (f > 0.5)))

一些示例结果:

  1.50:  2
 1.49:  1

 0.50:  1
 0.49:  0

-0.49:  0
-0.50: -1

-1.49: -1
-1.50: -2

原文由 EquipDev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题