Index: bltinmodule.c =================================================================== --- bltinmodule.c (revision 65124) +++ bltinmodule.c (working copy) @@ -2109,6 +2109,7 @@ builtin_round(PyObject *self, PyObject *args, PyObject *kwds) { double number; + double integral,fraction; double f; int ndigits = 0; int i; @@ -2121,18 +2122,27 @@ i = abs(ndigits); while (--i >= 0) f = f*10.0; - if (ndigits < 0) + + if (ndigits < 0) { number /= f; - else + if (number >= 0.0) + number = floor(number + 0.5); + else + number = ceil(number - 0.5); number *= f; - if (number >= 0.0) - number = floor(number + 0.5); - else - number = ceil(number - 0.5); - if (ndigits < 0) - number *= f; - else - number /= f; + } + else { + /*break double apart to avoid overflow*/ + fraction=modf(number, &integral); + fraction *= f; + if (number >= 0.0) + fraction = floor(fraction + 0.5); + else + fraction = ceil(fraction - 0.5); + fraction /= f; + number=integral+fraction; + } + return PyFloat_FromDouble(number); }