2016-11-15 7 views
0

Я хотел бы создать функцию f(x : float, up : bool) с этим вводом/выводом:округлить/вниз поплавок до 2 знаков после запятой

# 2 decimals part rounded up (up = True) 
f(142.452, True) = 142.46 
f(142.449, True) = 142.45 
# 2 decimals part rounded down (up = False) 
f(142.452, False) = 142.45 
f(142.449, False) = 142.44 

Теперь я знаю о round встроенной функции Python, но он всегда будет круглым 142.449 вверх , чего я не хочу.

Есть ли способ сделать это в более приятном питоническом способе, чем делать кучу поплавковых сравнений с эпсилонцами (подвержен ошибкам)?

+0

Это похоже на то, что он может работать лучше, чем операция с строкой. –

+0

Или, может быть, использовать 'ceil' и' floor' после перемещения десятичного числа –

ответ

3

Считаете ли вы математический подход, используя floor и ceil?

Если вы хотите всегда округлить до 2-х цифр, то вы можете предварительного умножения числа должны быть скруглены на 100, а затем выполнить округление до ближайшего целого числа, а затем разделить снова на 100.

from math import floor, ceil 

def rounder(num, up=True): 
    digits = 2 
    mul = 10**digits 
    if up: 
     return ceil(num * mul)/mul 
    else: 
     return floor(num*mul)/mul 
+0

спасибо, это очень хороший подход :) – valentin

0

math.ceil() раундов вверх и math.floor() раундов вниз. Ниже приведен пример использования:

import math 

def f(x, b): 
    if b: 
     return (math.ceil(100*x)/100) 
    else: 
     return (math.floor(100*x)/100) 

Эта функция должна выполнять именно то, что вы хотите.

1

Вы также можете выполнить некоторую математическую логику, если вы не хотите использовать какую-либо явную функцию, как:

def f(num, up): 
    num = num * 100 
    if up and num != int(num): # if up and "float' value != 'int' value 
     num += 1 
    return int(num)/(100.0) 

Здесь, идея, если up является True и int значения числа не равно float значения затем увеличьте число на 1. Иначе он будет таким же, как и исходный номер