我有一堆花车,我想把它们整理到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(),但只能舍入到最接近的整数。
提前致谢。
答案 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)
可能有一些简化它的方法,但你去了。