mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Move Decimal from the sandbox into production.
This commit is contained in:
parent
75cc1cb7e0
commit
0fff62f9cd
1 changed files with 62 additions and 0 deletions
|
@ -200,6 +200,68 @@ root:*:0:0:System Administrator:/var/root:/bin/tcsh
|
||||||
\end{seealso}
|
\end{seealso}
|
||||||
|
|
||||||
|
|
||||||
|
%======================================================================
|
||||||
|
\section{PEP 327: Decimal Data Type}
|
||||||
|
|
||||||
|
A new module, \module{decimal}, offers a \class{Decimal} data type for
|
||||||
|
decimal floating point arithmetic. Compared to the built-in \class{float}
|
||||||
|
type implemented with binary floating point, the new class is especially
|
||||||
|
useful for financial applications and other uses which require exact
|
||||||
|
decimal representation, control over precision, control over rounding
|
||||||
|
to meet legal or regulatory requirements, tracking of significant
|
||||||
|
decimal places, or for applications where the user expects the results
|
||||||
|
to match hand calculations done the way they were taught in school.
|
||||||
|
|
||||||
|
For example, calculating a 5% tax on a 70 cent phone charge gives
|
||||||
|
different results in decimal floating point and binary floating point
|
||||||
|
with the difference being significant when rounding to the nearest
|
||||||
|
cent:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
>>> from decimal import *
|
||||||
|
>>> Decimal('0.70') * Decimal('1.05')
|
||||||
|
Decimal("0.7350")
|
||||||
|
>>> .70 * 1.05
|
||||||
|
0.73499999999999999
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Note that the \class{Decimal} result keeps a trailing zero, automatically
|
||||||
|
inferring four place significance from two digit mulitiplicands. A key
|
||||||
|
goal is to reproduce the mathematics we do by hand and avoid the tricky
|
||||||
|
issues that arise when decimal numbers cannot be represented exactly in
|
||||||
|
binary floating point.
|
||||||
|
|
||||||
|
Exact representation enables the \class{Decimal} class to perform
|
||||||
|
modulo calculations and equality tests that would fail in binary
|
||||||
|
floating point:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
>>> Decimal('1.00') % Decimal('.10')
|
||||||
|
Decimal("0.00")
|
||||||
|
>>> 1.00 % 0.10
|
||||||
|
0.09999999999999995
|
||||||
|
|
||||||
|
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
|
||||||
|
True
|
||||||
|
>>> sum([0.1]*10) == 1.0
|
||||||
|
False
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
The \module{decimal} module also allows arbitrarily large precisions to be
|
||||||
|
set for calculation:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
>>> getcontext().prec = 24
|
||||||
|
>>> Decimal(1) / Decimal(7)
|
||||||
|
Decimal("0.142857142857142857142857")
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\begin{seealso}
|
||||||
|
\seepep{327}{Decimal Data Type}{Written by Facundo Batista and implemented
|
||||||
|
by Eric Price, Facundo Bastista, Raymond Hettinger, Aahz, and Tim Peters.}
|
||||||
|
\end{seealso}
|
||||||
|
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\section{Other Language Changes}
|
\section{Other Language Changes}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue