Python 中类似 Excel 的向上取整函数?
我知道有 math.ceil 和 numpy.ceil 这两个函数,但它们都没有 significance
这个参数。
举个例子,在 Excel 里:
=Ceiling(210.63, 0.05)
结果是 210.65
而使用 numpy.ceil 和 math.ceil 的结果是:
numpy.ceil(210.63)
结果是 211.0
math.ceil(210.63)
结果也是 211.0
所以,我在想,是否有类似于 Excel 的解决方案呢?
3 个回答
有很多库可以在Python中实现各种Excel公式。
像PyCel、Formulas、xlcalculator和Koala这些库,使用了一种叫做AST的技术,把Excel公式转换成Python代码。因此,它们通常会有现成的Python函数实现,能在不同程度上模拟“Excel是怎么计算的”(而不是其他地方的计算方式)。至少,它们会提供一些实现这些函数的思路,或者可以直接使用那些已经定义好的函数。
我是xlcalculator这个项目的负责人,所以我会用这个库来做演示。不过,其他库在这个任务上也同样能胜任。每个库的背景不同,因此它们各自的优点和支持的Excel功能也不一样。
通常,上面提到的这些库会读取一个Excel文件,把公式转换成Python代码,然后提供评估的功能。Xlcalculator还可以解析一个特别构造的字典,这正是我在这里利用的。
stackoverflow.py:
input_dict = {
"Sheet1!A1" : "=Ceiling(210.63, 0.05)"
}
from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator
compiler = ModelCompiler()
my_model = compiler.read_and_parse_dict(input_dict)
evaluator = Evaluator(my_model)
print("Sheet1!A1", evaluator.evaluate("Sheet1!A1"))
结果是:
>python stackoverflow.py
Sheet1!A1 210.66
你可以这样做。
ceil = lambda x,y: math.ceil(x*(1.0/y))/(1.0/y)
不过,这并不是绝对可靠的。
我不知道有没有现成的Python函数可以做到这一点,但你可以很简单地自己写一个:
import math
def ceil(x, s):
return s * math.ceil(float(x)/s)
在Python 2中,把数字转换成浮点数是必要的,这样可以避免如果两个参数都是整数时出现整数除法的问题。你也可以使用 from __future__ import division
这个语句来解决。不过在Python 3中就不需要这样做了。