Commit 1e162d37 authored by Guido van Rossum's avatar Guido van Rossum

Implement round() slightly different, so that for negative ndigits no

additional errors happen in the last step.  The trick is to avoid
division by 0.1**n -- multiply by 10.0**n instead.
parent ae94cf29
......@@ -1488,14 +1488,22 @@ builtin_round(self, args)
if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
return NULL;
f = 1.0;
for (i = ndigits; --i >= 0; )
i = abs(ndigits);
while (--i >= 0)
f = f*10.0;
for (i = ndigits; ++i <= 0; )
f = f*0.1;
if (ndigits < 0)
x /= f;
else
x *= f;
if (x >= 0.0)
return PyFloat_FromDouble(floor(x*f + 0.5) / f);
x = floor(x + 0.5);
else
x = ceil(x - 0.5);
if (ndigits < 0)
x *= f;
else
return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
x /= f;
return PyFloat_FromDouble(x);
}
static PyObject *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment