如何循环浮动0.5到1.0,同时仍然四舍五入到0.45到0.0,正如通常的学校四舍五入?

Equ*_*Dev 4 python floating-point rounding python-3.x

出现默认Python round(1 / 2)给出0.

如何循环浮动0.5到1.0,同时仍然四舍五入到0.45到0.0,正如通常的学校四舍五入?

注意:很抱歉删除并再次发布此内容,但它被错误地标记为另一个问题的副本.

Tre*_*her 8

实际上,目前认为不要盲目地围绕*.5向上.相反,将*.5舍入到最接近的偶数是合适的.Python 3实现了"银行家舍入"的这种"正确"形式,但许多其他语言(尚未).盲目舍入*.5向上会产生轻微偏差,但"银行家舍入"有助于平衡它.有关详细信息,请参阅此主题.所以...

方法1

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

import math

val = 1.5
x = 0

if (float(val) % 1) >= 0.5:
    x = math.ceil(val)
else:
    x = round(val)
Run Code Online (Sandbox Code Playgroud)

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

方法2

从我上面链接的帖子来看,看起来另一种选择是使用十进制模块来模拟舍入行为的"旧"方式.我有点复制和粘贴,但是你去了:

import decimal

x = decimal.Decimal('1.5').quantize(decimal.Decimal('1'), 
rounding=decimal.ROUND_HALF_UP)
Run Code Online (Sandbox Code Playgroud)

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

我猜这是标记为另一个的重复,因为一点点挖掘会给你足够的关于这个主题的信息.(我没有把它标记为副本,我只是假设这就是别人做的原因.)


Equ*_*Dev 5

进行“学校”舍入,对于中间的值从 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)))
Run Code Online (Sandbox Code Playgroud)

一些示例结果:

 1.50:  2
 1.49:  1

 0.50:  1
 0.49:  0

-0.49:  0
-0.50: -1

-1.49: -1
-1.50: -2
Run Code Online (Sandbox Code Playgroud)