如何在python中绕到更高的10位置

时间:2010-10-21 11:39:09

标签: python math

我有一堆花车,我想把它们整理到10的下一个最高倍数。

例如:

10.2 should be 20
10.0 should be 10
16.7 should be 20
94.9 should be 100

我只需要从0-100开始。我尝试过math.ceil(),但只能舍入到最接近的整数。

提前致谢。

4 个答案:

答案 0 :(得分:12)

from math import ceil

def ceil_to_tens(x):
    return int(ceil(x / 10.0)) * 10

编辑:好的,既然我对这个答案有一个不应有的“好答案”徽章,我认为应该使用decimal模块给社区一个适当的解决方案从这些问题:)感谢杰夫指出这一点。因此,使用decimal的解决方案的工作原理如下:

from decimal import Decimal, ROUND_UP

def ceil_to_tens_decimal(x):
    return (Decimal(x) / 10).quantize(1, rounding=ROUND_UP) * 10

当然上面的代码要求x是一个整数,一个字符串或一个Decimal对象 - 浮点数不会起作用,因为这会破坏使用decimal的整个目的模块。

遗憾的是Decimal.quantize对于大于1的数字不能正常工作,它会保存除法乘法技巧。

答案 1 :(得分:4)

>>> x = 16.7
>>> int( 10 * math.ceil(x/10.0))

答案 2 :(得分:1)

这里的答案充满了危险。例如11*1.1 - 2.1 = 10.0,对吧?但是等等:

>>> x = 11*1.1 - 2.1
>>> int(ceil(x / 10.0)) * 10
20
>>> x
10.000000000000002
>>> 

你可以试试这个

int(ceil(round(x, 12) / 10.0)) * 10

但是选择要舍入的小数位数确实很困难,因为很难预测浮点噪声是如何累积的。如果始终将此设置为正确非常重要,那么您需要使用定点算术或十进制。

答案 3 :(得分:0)

如果你正在寻找另一个不涉及浮点除法的解决方案,这里有一个使用模数的解决方案:

def ceil_to_tens_mod(x):
    tmp = int(ceil(x))
    mod10 = tmp % 10
    return tmp - mod10 + (10 if mod10 else 0)

可能有一些简化它的方法,但你去了。