我知道 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 解决方案的东西?
我不知道有任何 Python 函数可以实现这个功能,但您可以轻松编写一个:
import math
def ceil(x, s):
return s * math.ceil(float(x)/s)
在Python 2中,将整数转换为浮点数是必要的,以避免两个整数相除时出现整数除法。你也可以使用from __future__ import division
。在Python 3中不需要这样做。
你可以这样做。
ceil = lambda x,y: math.ceil(x*(1.0/y))/(1.0/y)
但这并不是绝对可靠的。
有许多库已经在Python中实现了很多Excel公式。
像PyCel、Formulas、xlcalculator和Koala这样的库使用AST将Excel公式转换为Python,因此通常具有各种程度的“Excel如何计算事物”(而不是其他地方可能会做的方式)的预制Python函数实现。至少有关于如何实现这些函数的想法,或者潜在地使用已经定义好函数的那些函数。
我是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(212, 10)
返回210
,即使它应该返回220
。在 Python 2.x 中,整数除法默认为整数。我在我的答案中遇到了类似的问题(但不完全相同),必须使用 1.0 强制执行浮点除法。 - rplnt