Предполагается, что следующая функция преобразует данное число до ближайшего шага:
def ceil_step(x, step):
return math.ceil(x / step) * step
Это работает хорошо ... до тех пор, пока это не произойдет:
print(ceil_step(1000.365, 0.01)) # 1000.37
print(ceil_step(1000.369, 0.01)) # 1000.37
print(ceil_step(1000.370, 0.01)) # 1000.37
print(ceil_step(1000.371, 0.01)) # 1000.38
print(ceil_step(10000.365, 0.01)) # 10000.37
print(ceil_step(10000.369, 0.01)) # 10000.37
print(ceil_step(10000.370, 0.01)) # 10000.380000000001
print(ceil_step(10000.371, 0.01)) # 10000.380000000001
Работающая реализация было бы:
def ceil_step(x, step):
return Decimal(str(x)).quantize(Decimal(str(step)), rounding=ROUND_CEILING)
К сожалению, я не могу использовать его, потому что пишу код с ускорением Numba Python. Поэтому мой вопрос: существует ли способ реализовать функцию ceil_step
(и аналогично floor_step
) так, чтобы она использовала только базовые операции c с плавающей запятой или вызовы функций с поддержкой Numba и давала надежные результаты?