在Python中,有没有办法知道某个数是向上还是向下舍入的?

3

我想知道我的方程结果(类似于 x / y 这样的简单方程)是向上还是向下舍入。原因是在舍入后,我有两个简单的语句如下:

if h % 2 != 0: h = h + 1
if h % 4 != 0: h = h + 2

根据四舍五入的方向,我将选择+-运算符,因此如果结果四舍五入并且h % 2 != 0,则h = h + 1,如果结果向下舍入,则h = h - 1round()函数提供了这种信息吗?
此外,我的数学计算正确吗?(我希望结果可被4整除)

你控制舍入部分还是可以访问未舍入的结果? - user2390182
round() 不会报告那个信息。但是你可以比较未舍入的结果和舍入后的结果来看哪个更大,这样就能知道了。 - John Gordon
@schwobaseggl 是的,没错。 - Derp
@JohnGordon 我最初考虑了另一种方法,但不知道如何实现。它是这样的:推迟四舍五入,并根据结果浮点数决定使用哪个运算符(即如果小于5,则为“-”,否则为“+”),然后再进行四舍五入。 - Derp
你是否试图将数字四舍五入到最接近的2和4的倍数? - Barmar
显示剩余2条评论
4个回答

1

如果小数点后的数字:

  • >=5,那么最终值将加1。
  • <5,则最终值将按原样返回到指定的小数位。

但是您可以使用 math 包中的 ceilfloor,它们分别总是向上或向下舍入。

import math

>>> math.ceil(5.2)
6
>>> math.floor(5.9)
5

这样我就必须手动检查结果,这在我的情况下是不直观的。 - Derp

1

Try this to round to 4 directly :

import math

h = 53.75
rounded = math.round(h / 4) * 4

if (rounded > h):
  print("Rounded up by " + str(rounded - h))
else:
   print("Rounded down by " + str(h - rounded))

math.floor() 总是向下取整。 - Barmar
是的,是的,那是一个错误,已经被编辑了。谢谢。 - dspr
你能否解释一下你的数学计算?它是否总是会给我最接近的四的倍数? - Derp
假设您想将23舍入为5的倍数:23 / 5.0 => 4.6,然后 math.round(4.6) => 5 最后 5 * 5 => 25 - dspr
@dspr 我明白了那部分,只是想知道背后的理论。无论如何,我根据你上面的代码改变了我的代码,现在我只有一个语句而不是两个: if h % 4 != 0: h = D(h / 4).quantize(D('1'), rounding=decimal.ROUND_HALF_UP) * 4 感谢你的提示。 - Derp
A. h/4会给出h相对于从0开始的“4块”位置。B. 你正在使用round进行最接近块开头的平均值计算。这将始终对应于最接近的4的倍数,尽管它还不在正确的比例尺上。C. 通过乘以每个块的值,您将返回到原始数字比例尺。 - JeanOlivier

0
假设你想知道 3.94.4 是否被四舍五入了。你可以像这样操作:
def is_rounded_down(val, ndigits=None):
    return round(val, ndigits) < val

然后你可以简单地调用该函数来找出答案。

>>> is_rounded_down(3.9)
False
>>> is_rounded_down(4.4)
True

默认情况下,round() 不提供该信息,因此您需要自行检查。


0

对于 Python 2.X,整数除法返回一个整数并总是向下取整。

add@LM1756:~$ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22)
>>> print 8/3
2
>>> print type(5/2)
<type 'int'>

在 Python 3.X 中,整数除法返回一个浮点数,因此不会出现四舍五入的情况。
add@LM1756:~$ python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
>>> print(8/3)
2.6666666666666665
>>> type(8/3)
<class 'float'>
>>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接