round-function equivalents with different rounding-modes
Project description
Rounders
The rounders package extends the functionality provided by Python's built-in
round function. It aims to
provide a more complete and consistent collection of decimal rounding functionality than
is provided by the Python core and standard library. Specifically, it provides:
- Drop-in replacements for
roundthat use rounding modes other than Python's default Banker's rounding mode. Thirteen different rounding modes are available. - Functionality for rounding to a given number of significant figures, rather than to a set number of places after or before the decimal point.
Package contents
General-purpose rounding functions
There are four general-purpose rounding functions. These all accept an optional mode
argument for specifying the rounding mode, and default to using TIES_TO_EVEN (Banker's
rounding) if no mode is specified.
-
The
roundfunction has the same signature as the built-inround. It supports rounding to the nearest integer in the direction of the given rounding mode, and rounding to a given number of places while preserving the type of the input.>>> from rounders import round, TIES_TO_AWAY, TO_MINUS >>> round(2.5) # The default rounding mode is TIES_TO_EVEN 2 >>> round(2.5, mode=TIES_TO_AWAY) # round halfway cases away from zero 3 >>> round(2.97, 1, mode=TO_MINUS) # round towards negative infinity (like floor) 2.9 >>> round(Decimal(-1628), -2, mode=TO_MINUS) # Decimal and Fraction types supported Decimal('-1.7E+3')
-
The
round_to_figuresfunction rounds to a given number of significant figures, rather than to a given number of places before or after the decimal point.>>> from rounders import round_to_figures, TO_AWAY >>> round_to_figures(1.234567, 3) 1.23 >>> round_to_figures(1234567., 3) 1230000.0 >>> round_to_figures(0.0001234567, 3) 0.000123 >>> round_to_figures(0.0001234567, 3, mode=TO_AWAY) # round away from zero 0.000124
-
The
round_to_intandround_to_placesfunctions provide separately the two pieces of functionality thatroundcombines:round_to_introunds to a nearby integer using the given rounding mode, whileround_to_placesalways expects anndigitsargument and rounds to the given number of places. Theroundfunction is currently a simple wrapper aroundround_to_intandround_to_places.>>> from rounders import round_to_int, round_to_places, TO_PLUS >>> round_to_int(3.1415, mode=TO_PLUS) 4 >>> round_to_places(3.1415, 2, mode=TO_PLUS) 3.15
Rounding-mode-specific rounding functions
There are thirteen functions that act as drop-in replacements for round, but that use
a specific rounding mode. For example, if you always want to round ties away from zero
instead of to the nearest even number, you can do this:
>>> from rounders import round_ties_to_away as round
>>> round(4.5)
5
>>> round(1.25, 1)
1.3
Or if you want a version of math.ceil that accepts a number of places after the point,
you can do:
>>> from rounders import ceil
>>> ceil(1.78)
2
>>> ceil(1.782, 2)
1.79
>>> ceil(-1.782, 2)
-1.78
The complete list of functions is below
Rounding modes
These are the currently supported rounding modes, along with their corresponding mode-specific rounding functions.
To-nearest rounding modes
There are six to-nearest rounding modes: these all round to the closest target value
(e.g., to the closest integer in the case of round_to_int), and differ only in their
handling of ties.
| Rounding mode | Function | Description |
|---|---|---|
TIES_TO_EVEN |
round_ties_to_even |
Ties rounded to the nearest even value |
TIES_TO_ODD |
round_ties_to_odd |
Ties rounded to the nearest odd value |
TIES_TO_AWAY |
round_ties_to_away |
Ties rounded away from zero |
TIES_TO_ZERO |
round_ties_to_zero |
Ties rounded towards zero |
TIES_TO_MINUS |
round_ties_to_minus |
Ties rounded towards negative infinity |
TIES_TO_PLUS |
round_ties_to_plus |
Ties rounded towards positive infinity |
Directed rounding modes
There are six matching directed rounding modes: for these, all values between any two representable output values will be rounded in the same direction.
| Rounding mode | Function | Description |
|---|---|---|
TO_EVEN |
round_to_even |
Round to the nearest even value |
TO_ODD |
round_to_odd |
Round to the nearest odd value |
TO_AWAY |
round_to_away |
Round away from zero |
TO_ZERO |
round_to_zero |
Round towards zero |
TO_MINUS |
round_to_minus |
Round towards negative infinity |
TO_PLUS |
round_to_plus |
Round towards positive infinity |
Miscellaneous rounding modes
There's one miscellaneous rounding mode TO_ZERO_05_AWAY, with corresponding function
round_to_zero_05_away.
| Rounding mode | Function | Description |
|---|---|---|
TO_ZERO_05_AWAY |
round_to_zero_05_away |
See below |
This rounding mode matches the behaviour of TO_ZERO, except in the case where
rounding towards zero would produce a final significant digit of 0 or 5. In that
case, it matches the behaviour of TO_AWAY instead. Note that in the case where the
value is already rounded to the required number of digits, neither TO_ZERO nor
TO_AWAY would change its value, and similarly TO_ZERO_05_AWAY does not change
the value in this case.
>>> from rounders import round_to_zero_05_away
>>> round_to_zero_05_away(1.234, 1) # behaves like `TO_ZERO`
1.2
>>> round_to_zero_05_away(-1.294, 1) # also behaves like `TO_ZERO`
-1.2
>>> round_to_zero_05_away(1.534, 1) # `TO_ZERO` would give 1.5, so round away
1.6
>>> round_to_zero_05_away(-2.088, 1) # `TO_ZERO` would give -2.0, so round away
-2.1
>>> round_to_zero_05_away(3.5, 1) # `TO_ZERO` wouldn't change the value; leave as-is
3.5
Aliases
The functions trunc, floor and ceil are aliases for round_to_zero,
round_to_minus and round_to_plus, respectively.
Notes on rounding modes
Some notes on particular rounding modes:
-
TIES_TO_EVENgoes by a variety of names, including "Banker's rounding", "statisticians' rounding", and "Dutch rounding". It matches Python's default rounding mode and the IEEE 754 default rounding mode,roundTiesToEven. Many other languages also use this rounding mode by default. -
TIES_TO_AWAYappears to be the rounding mode most commonly taught in schools, and is the mode that users often mistakenly expectroundto use. Python 2'sroundfunction used this rounding mode. -
TIES_TO_PLUSmatches the rounding mode used by JavaScript'sMath.round, and also appears to be commonly taught. (See ECMA-262, 13th edn., §21.3.2.28.) -
TIES_TO_ZEROis used in IEEE 754's "Augmented arithmetic operations". -
TO_ZEROmatches the behaviour ofmath.trunc -
TO_PLUSmatches the behaviour ofmath.ceil -
TO_MINUSmatches the behaviour ofmath.floor -
TO_ODDis interesting as a form of "round for reround", providing a way to avoid the phenomenon of double rounding. Suppose we're given a real numberxand a number of placesp. Letybe the result of roundingxtop + 2places using theTO_ODDrounding mode. Thenycan act as a proxy forxwhen rounding topplaces, in the sense thatyandxwill round the same way under any of the rounding modes defined in this module. (The binary analog ofTO_ODDis a little more useful here - it works in the same way, but requires only two extra bits for the intermediate value instead of two extra digits.) -
TO_ZERO_05_AWAYalso provides a form of "round for reround", but is more efficient in that it only requires one extra decimal digit instead of two. Given a valuexand a number of placesp, ify = round(x, p + 1, mode=TO_ZERO_05_AWAY), thenround(x, p, mode=mode) == round(y, p, mode=mode)for any of the thirteen rounding modes defined in this package.>>> from rounders import * >>> import random >>> x = random.uniform(-1.0, 1.0) >>> y = round(x, 5, mode=TO_ZERO_05_AWAY) >>> round(x, 4, mode=TO_ZERO) == round(y, 4, mode=TO_ZERO) True >>> round(x, 4, mode=TIES_TO_ODD) == round(y, 4, mode=TIES_TO_ODD) True >>> round(x, 4, mode=TO_ZERO_05_AWAY) == round(y, 4, mode=TO_ZERO_05_AWAY) True
On relationships between the rounding modes in this package and rounding modes elsewhere:
-
IEEE 754 defines five "rounding-direction" attributes:
roundTiesToEven,roundTiesToAway,roundTowardPositive,roundTowardNegativeandroundTowardZero. These matchTIES_TO_EVEN,TIES_TO_AWAY,TO_PLUS,TO_MINUSandTO_ZERO, respectively. The "Augmented arithmetic operations" section of IEEE 754-2019 also defines an attributeroundTiesToZero, corresponding toTIES_TO_ZEROin this module.IEEE 754 rounding direction roundersrounding moderoundTiesToEvenTIES_TO_EVENroundTiesToAwayTIES_TO_AWAYroundTiesToZeroTIES_TO_ZEROroundTowardPositiveTO_PLUSroundTowardNegativeTO_MINUSroundTowardZeroTO_ZERO -
As of Python 3.11, Python's
decimalmodule defines eight rounding options, corresponding to the rounding modes in this module as follows:decimalrounding optionroundersrounding modeROUND_CEILINGTO_PLUSROUND_DOWNTO_ZEROROUND_FLOORTO_MINUSROUND_HALF_DOWNTIES_TO_ZEROROUND_HALF_EVENTIES_TO_EVENROUND_HALF_UPTIES_TO_AWAYROUND_UPTO_AWAYROUND_05UPTO_ZERO_05_AWAY
Supported numeric types
Out of the box, rounders supports Python's built-in numeric types: int, float,
decimal.Decimal and fractions.Fraction. Under the hood, it uses
functools.singledispatch
for all type-specific operations. This should allow easy extension to new numeric
types in the future. The extension mechanism has not yet stabilised.
Future directions
Major goals for future releases:
- Add formatting support, including the ability to specify rounding direction in a format specification.
- Finalise and document mechanisms for adding support for custom types.
- Improve performance of
round, especially for thefloattype, with the aid of a C extension if necessary. - Better document the pitfalls of
roundapplied to binary floats (especially for directed rounding modes, whereroundis not idempotent).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rounders-0.2.0.tar.gz.
File metadata
- Download URL: rounders-0.2.0.tar.gz
- Upload date:
- Size: 41.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc6b4d3a9f71735afcad269e3ab062f915f872a3d8c35ade7b584e6b481f8549
|
|
| MD5 |
065c3d0af77a4e23dd224c576f5ee7b7
|
|
| BLAKE2b-256 |
afa0bad362544283bbf88bbcfef3ec12e2fe7f23a6935d4f904c89125e707011
|
File details
Details for the file rounders-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rounders-0.2.0-py3-none-any.whl
- Upload date:
- Size: 36.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe00a257d536eb5c92b32fd42b10a730429f083a3990b6ca9d808ec722adfd3c
|
|
| MD5 |
49fcd31aa6c5c150da381df0c9101ac1
|
|
| BLAKE2b-256 |
ad45ab826de4b232045f234a9877b1ca74300d3c1dc66b6e20e4a7a197587cda
|