Mercurial > cpython-lru_cache-weakref
diff Python/bltinmodule.c @ 8287:d3bf3c2ad75a legacy-trunk
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.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Sat, 09 May 1998 14:42:25 +0000 |
| parents | 9d0310143600 |
| children | 0cb0394c2edc |
line wrap: on
line diff
--- a/Python/bltinmodule.c Fri May 08 21:52:55 1998 +0000 +++ b/Python/bltinmodule.c Sat May 09 14:42:25 1998 +0000 @@ -1488,14 +1488,22 @@ 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 - return PyFloat_FromDouble(ceil(x*f - 0.5) / f); + x = ceil(x - 0.5); + if (ndigits < 0) + x *= f; + else + x /= f; + return PyFloat_FromDouble(x); } static PyObject *
