The fixedpoint module defines the FixedPoint class which provides a fixed decimal data type that supports python operators and standard functions. FixedPoint objects are useful when computing financial transactions where precision is critical.
FixedPoint objects support decimal arithmetic with a fixed number of digits (called the object's precision) after the decimal point. The number of digits before the decimal point is variable and unbounded.
The precision is user-settable on a per-object basis when a FixedPoint
is constructed, and may vary across FixedPoint objects. The precision
may also be changed after construction via FixedPoint
Note that if the precision of a FixedPoint object is reduced via
information may be lost to rounding.
The FixedPoint constructor can be passed an
int, long, string, float,
FixedPoint, or any object convertible to a
float() or to a
long(). Passing a precision is optional; if specified, the
precision must be a non-negative
int. There is no inherent limit on
the size of the precision, but if very very large you'll probably run
out of memory.
The following Python operators and functions accept FixedPoints in the expected ways:
||with auto-coercion of other types to FixedPoint.|
||of FixedPoints are always exact.|
||of FixedPoints may lose information to rounding, in which case the result is the infinitely precise answer rounded to the result's precision.|
|use as dict keys|
|use as boolean (e.g. "
When FixedPoint objects of different precision are combined via
+ - * /,
the result is computed to the larger of the inputs' precisions, which also
becomes the precision of the resulting FixedPoint object.
>>> print FixedPoint("3.42") + FixedPoint("100.005", 3) 103.425 >>>
When a FixedPoint is combined with other numeric types (
strings representing a number) via
+ - * /, then similarly the computation
is carried out using- and the result inherits -the FixedPoint's
>>> print FixedPoint(1) / 7 0.14 >>> print FixedPoint(1, 30) / 7 0.142857142857142857142857142857 >>>
The string produced by
str(x) (implicitly invoked by "
x.get_precision() digits. If x is
str(x) == "-".
Note that conversion of
floats to FixedPoint can be surprising, and
should be avoided whenever possible. Conversion from string is exact
(up to final rounding to the requested precision), so is greatly
>>> print FixedPoint(1.1e30) 1099999999999999993725589651456.00 >>> print FixedPoint("1.1e30") 1100000000000000000000000000000.00 >>>
FixedPoint objects have the following public methods:
x.frac() + long(x)==
int>= 0, and defaults to
DEFAULT_PRECISION. If precision is less than this FixedPoint's current precision, information may be lost to rounding.
The fixedpoint module also defines the following (private) functions:
|p = max(x.p, y.p)|
|x = xn / 10**p|
|y = yn / 10**p|
x must be FixedPoint to begin with; if y is not FixedPoint,it inherits its precision from x.
Note that this method is called a lot, so default-arg tricks are helpful.
float string value == n * 10**pexactly.
The fixedpoint module exports the following data item(s):