2013-01-16 3 views
3

Сегодня у меня есть вопрос о округлении чисел, используя условия в Python.Python условно округляет номера

Я делаю сайт для продажи, и мой клиент хочет округлить цены в зависимости от результата, конвертирующего их из доллара США в колумбийские песо. Например: 200 USD к результатам КС в 353990 КС, и она должна быть округленной до 359000.

Он реализовали функцию, которая делает трюк в Excel:

= IF (F4> = 10000000 , (ОКРУГЛВВЕРХ (F4, -6) -100000), ЕСЛИ (F4> = 1000000, (Roundup (F4, -5) -10000), ЕСЛИ (F4> = 100000, (ОКРУГЛВВЕРХ (F4, -4) -1000) , ЕСЛИ (F4> = 10000, (ОКРУГЛВВЕРХ (F4, -3) -1000), ЕСЛИ (F4> = 0, (ОКРУГЛВВЕРХ (F4, -3)))))))

мне нужно делайте то же самое, но на Python, и я не знаю, как это сделать.

Спасибо, что помогли мне!

+0

Я не вижу, почему 353990 должны быть округлены до 359000 ... возможно, 354000 или 360000 ... – mgilson

+0

ли вам имеют какой-то источник данных для коэффициентов конверсии и значительных цифр для каждой поддерживаемой валюты? Я сомневаюсь, что ваш клиент хочет округлить до следующего 1000 при конвертации в евро ... –

+0

@mgilson, я думаю, идея состоит в том, чтобы округлить цену, так что последняя цифра - это «9», вроде как цены на США, которые заканчиваются на ' .99'. –

ответ

2
def round_up(value, multiple): 
    return multiple * math.ceil(float(value)/multiple) 

def digits(value): 
    return int(math.log(value, 10)) + 1 

def round_price(value): 
    if value < 10000: 
     return int(round_up(value, 1000)) 
    d = digits(value) 
    new_value = int(round_up(value, 10 ** (d - 2))) 
    new_value -= 10 ** (d - 3) 
    return new_value 
+0

@unutbu, я не обращал достаточного внимания на последний термин формулы Excel. Мне придется сделать небольшое исправление для моего ответа. Я думаю, что «ROUNDUP (100, -3)» будет таким же, как мой «round_up (100, 1000)». –

+0

Вы гений Марк, спасибо за ответ, это именно то, что мне нужно –

5
import math 
roundup = lambda x: math.ceil(x/1000.0) * 1000 

Хотя округление от 353990 до 359000 не имеет смысла. Эта функция округляет 353990 до 354000.

Если вы хотите нормальный закругление, а не «округлить», вы бы просто использовать встроенный Funciton round:

round(x, -3) 

и так для общего roundup с та же функция подписи в круглом

def roundup(x, n=0): 
    return math.ceil(x * (10**n)) * (10**-n) 
+0

Отредактировано. Благодаря! – forivall

+0

Приобретенный, приветствую :) – mgilson

Смежные вопросы