def round(x, ndigits=0): """ round(number[, ndigits]) - double-precision real number Round a number to a given precision in decimal digits (default 0 digits). If no precision is specified this just calls the element's .round() method. EXAMPLES:: sage: round(sqrt(2),2) 1.41 sage: q = round(sqrt(2),5); q 1.41421 sage: type(q) <type 'sage.rings.real_double.RealDoubleElement'> sage: q = round(sqrt(2)); q 1 sage: type(q) <type 'sage.rings.integer.Integer'> sage: round(pi) 3 sage: b = 5.4999999999999999 sage: round(b) 5 Since we use floating-point with a limited range, some roundings can't be performed:: sage: round(sqrt(Integer('1'*1000)),2) +infinity IMPLEMENTATION: If ndigits is specified, it calls Python's builtin round function, and converts the result to a real double field element. Otherwise, it tries the argument's .round() method; if that fails, it reverts to the builtin round function, converted to a real double field element. .. note:: This is currently slower than the builtin round function, since it does more work - i.e., allocating an RDF element and initializing it. To access the builtin version do ``from six.moves import builtins; builtins.round``. """ try: if ndigits: return RealDoubleElement(builtins.round(x, ndigits)) else: try: return x.round() except AttributeError: return RealDoubleElement(builtins.round(x, 0)) except ArithmeticError: if not isinstance(x, RealDoubleElement): return round(RDF(x), ndigits) else: raise