decorator for rounding a function's input argument and keywords to the
    given precision *tol*.  This decorator always rounds to a floating point
    number.
    Rounding is only done for arguments or keywords that are floats.
    For example:
    >>> @simple_round(tol=1)
    ... def add(x,y):
    ...   return x+y
    ...
    >>> add(2.54, 5.47)
    8.0
    >>>
    >>> # does not round elements of iterables, only rounds at the top-level
    >>> add([2.54, 5.47],['x','y'])
    [2.54, 5.4699999999999998, 'x', 'y']
    >>>
    >>> # does not round elements of iterables, only rounds at the top-level
    >>> add([2.54, 5.47],['x',[8.99, 'y']])
    [2.54, 5.4699999999999998, 'x', [8.9900000000000002, 'y']]

def simple_round(tol=0):
    """decorator for rounding a function's input argument and keywords to the
    given precision *tol*.  This decorator always rounds to a floating point
    number.
    Rounding is only done for arguments or keywords that are floats.
    For example:
    >>> @simple_round(tol=1)
    ... def add(x,y):
    ...   return x+y
    ...
    >>> add(2.54, 5.47)
    8.0
    >>>
    >>> # does not round elements of iterables, only rounds at the top-level
    >>> add([2.54, 5.47],['x','y'])
    [2.54, 5.4699999999999998, 'x', 'y']
    >>>
    >>> # does not round elements of iterables, only rounds at the top-level
    >>> add([2.54, 5.47],['x',[8.99, 'y']])
    [2.54, 5.4699999999999998, 'x', [8.9900000000000002, 'y']]
    """
    def dec(f):
        def func(*args, **kwds):
            if tol is None:
                _args,_kwds = args,kwds
            else:
                _simple_round = simple_round_factory(tol)
                _args,_kwds = _simple_round(*args, **kwds)
            return f(*_args, **_kwds)
        return func
    return dec