Python中的舍入规则

时间:2011-04-28 23:13:15

标签: python rounding

我试图在python中找到一些不同的规则。例如;

10.666 = 10.6
10.667 = 10.7

即向下6,向上7。

有没有办法可以用Python做到这一点?

6 个答案:

答案 0 :(得分:5)

使用decimal.Decimal。它内置并调试了各种复杂的舍入规则。

http://docs.python.org/library/decimal.html

答案 1 :(得分:1)

我不确定你究竟采用了什么样的舍入规则。你能详细说明你的舍入规则吗?

因此我不能说完全正确,但我怀疑你可以将它用作实现模式。

def cround(v):
    """
    Round number down at 1st decimal place when the digit in the 
    3rd decimal place is <= 6, up when >= 7
    """
    v *= 10
    q = str(round(v, 2))
    if int(q[-1]) <= 6:
        return int(v) / 10.0
    return round(v) / 10.0

NUMS = [
    10.666, 10.667, 0.1, 1.0, 10.11, 10.22, 10.06, 10.006, 11.6, 11.7,
    10.666123, 10.667123, 10.888, 10.999 ]

for num in NUMS:
    print str(num).ljust(11), cround(num)

输出:

10.666      10.6
10.667      10.7
0.1         0.1
1.0         1.0
10.11       10.1
10.22       10.2
10.06       10.0
10.006      10.0
11.6        11.6
11.7        11.7
10.666123   10.6
10.667123   10.7
10.888      10.9
10.999      11.0

答案 2 :(得分:1)

如果要舍入的部分大于或等于其最大值的1/3,那么你想要的是向上舍入,否则向下舍入,那么我相信你可以使用普通round()函数首先减去⅙*想要的精度:

def my_round(n):
    return round(n - .1/6, 1)

>>> print(my_round(10.666))
10.6
>>> print(my_round(10.667))
10.7

答案 3 :(得分:0)

是的,你可以。正如你没有描述规则,但我假设你知道你想要什么,你可以将数字转换为字符串,逐个字符地迭代它,一旦到达字符超过十进制2步。你可以按照你的规则行事。

还有一个builin round函数,它可以将数字四舍五入到给定的精度。

答案 4 :(得分:0)

这是一种方法(使用simplebias的测试数据)

>>> def cround(v):
...     return round(v-2.0/9, 1)+.2
... 
>>> 
>>> NUMS = [
...     10.666, 10.667, 0.1, 1.0, 10.11, 10.22, 10.06, 10.006, 11.6, 11.7,
...     10.666123, 10.667123, 10.888, 10.999 ]
>>> 
>>> for num in NUMS:
...     print str(num).ljust(11), cround(num)
... 
10.666      10.6
10.667      10.6
0.1         0.1
1.0         1.0
10.11       10.1
10.22       10.2
10.06       10.0
10.006      10.0
11.6        11.6
11.7        11.7
10.666123   10.6
10.667123   10.6
10.888      10.9
10.999      11.0

答案 5 :(得分:-2)

我想让它尽可能简单。

您有三种功能ceilfloorround。舍入规则如下:

  • ceil() 向上舍入,表示:

    ceil(10.1) = 11ceil(10.9) = 11

  • floor() 向下舍入,表示:

    floor(10.1) = 10floor(10.9) = 10

  • round() 取决于您的值(此处,向上(&gt; = 10.5)或向下(&lt; 10.5)),这意味着:

    round(10.1) = 10round(10.9) = 11

如果您使用ceilfloor,首先必须导入数学模块,例如from math import ceil

有关详细信息,我建议您在这里查看:Floating Point Arithmetic: Issues and Limitations