如何在python中舍入整数

时间:2010-07-27 23:39:49

标签: python

我正在尝试在python中循环整数。我查看了内置的round()函数,但它看起来像是浮点数。

我的目标是将整数舍入到最接近的10的倍数。即:5-> 10,4-> 0,95-> 100等

5和更高应该向上舍入,4和更低应该向下舍入。

这是我执行此操作的代码:

def round_int(x):
    last_dig = int(str(x)[-1])
    if last_dig >= 5:
        x += 10
    return (x/10) * 10

这是实现我想要实现的目标的最佳方式吗?是否有内置功能可以做到这一点?另外,如果这是最好的方法,那么我在测试中遗漏的代码有什么问题吗?

7 个答案:

答案 0 :(得分:122)

实际上,你仍然可以使用圆函数:

>>> print round(1123.456789, -1)
1120.0

这将舍入到10的最接近的倍数。对于100,将-2作为第二个参数,依此类推。

答案 1 :(得分:27)

round()可以获取位数的整数和负数,它们在小数点的左边。返回值仍然是一个浮点数,但是一个简单的转换修复了:

>>> int(round(5678,-1))
5680
>>> int(round(5678,-2))
5700
>>> int(round(5678,-3))
6000

答案 2 :(得分:8)

稍微简单一些:

def round_int(x):
    return 10 * ((x + 5) // 10)

答案 3 :(得分:3)

关于返回浮点数的round(..)函数

浮点数(Python中的双精度)始终是整数的完美表示,只要它在[-2 53 .. 2 53 的范围内]。 (小提琴注意:它不是双打的两个补码,因此范围对称为零。)

有关详细信息,请参阅discussion here

答案 4 :(得分:2)

我想做同样的事情,但用5而不是10,并提出了一个简单的功能。希望它有用:

def roundToFive(num):
    remaining = num % 5
    if remaining in range(0, 3):
        return num - remaining
    return num + (5 - remaining)

答案 5 :(得分:1)

如果你想要代数形式并且仍然使用它,那么它很难变得简单:

interval = 5
n = 4
print(round(n/interval))*interval

答案 6 :(得分:1)

此函数将以数量级(从右到左)或数字的方式舍入,格式与处理浮点小数位的方式相同(从左到右:

def intround(n, p):
    ''' rounds an intger. if "p"<0, p is a exponent of 10; if p>0, left to right digits '''
    if p==0: return n
    if p>0:  
        ln=len(str(n))  
        p=p-ln+1 if n<0 else p-ln
    return (n + 5 * 10**(-p-1)) // 10**-p * 10**-p

>>> tgt=5555555
>>> d=2
>>> print('\t{} rounded to {} places:\n\t{} right to left \n\t{} left to right'.format(
        tgt,d,intround(tgt,-d), intround(tgt,d))) 

打印

5555555 rounded to 2 places:
5555600 right to left 
5600000 left to right

您也可以使用Decimal类:

import decimal
import sys

def ri(i, prec=6):
    ic=long if sys.version_info.major<3 else int
    with decimal.localcontext() as lct:
        if prec>0:
            lct.prec=prec
        else:
            lct.prec=len(str(decimal.Decimal(i)))+prec  
        n=ic(decimal.Decimal(i)+decimal.Decimal('0'))
    return n

在Python 3上,您可以可靠地使用带有负位置的舍入并获得舍入整数:

def intround2(n, p):
    ''' will fail with larger floating point numbers on Py2 and require a cast to an int '''
    if p>0:
        return round(n, p-len(str(n))+1)
    else:
        return round(n, p)    

在Python 2上,round将无法在较大的数字上返回正确的圆整数,因为round总是返回一个float:

>>> round(2**34, -5)
17179900000.0                     # OK
>>> round(2**64, -5)
1.84467440737096e+19              # wrong 

其他2个函数适用于Python 2和3