[code.view]

[top] / python / PyMOTW / docs / decimal / index.html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>decimal – Fixed and floating point math &mdash; Python Module of the Week</title>
    <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '1.132',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="author" title="About these documents" href="../about.html" />
    <link rel="top" title="Python Module of the Week" href="../index.html" />
    <link rel="up" title="Numeric and Mathematical Modules" href="../numeric.html" />
    <link rel="next" title="fractions – Rational Numbers" href="../fractions/index.html" />
    <link rel="prev" title="Numeric and Mathematical Modules" href="../numeric.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="../fractions/index.html" title="fractions – Rational Numbers"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="../numeric.html" title="Numeric and Mathematical Modules"
             accesskey="P">previous</a> |</li>
        <li><a href="../contents.html">PyMOTW</a> &raquo;</li>
          <li><a href="../numeric.html" accesskey="U">Numeric and Mathematical Modules</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">decimal &#8211; Fixed and floating point math</a><ul>
<li><a class="reference internal" href="#decimal">Decimal</a></li>
<li><a class="reference internal" href="#arithmetic">Arithmetic</a></li>
<li><a class="reference internal" href="#logarithms">Logarithms</a></li>
<li><a class="reference internal" href="#special-values">Special Values</a></li>
<li><a class="reference internal" href="#context">Context</a><ul>
<li><a class="reference internal" href="#current-context">Current Context</a></li>
<li><a class="reference internal" href="#precision">Precision</a></li>
<li><a class="reference internal" href="#rounding">Rounding</a></li>
<li><a class="reference internal" href="#local-context">Local Context</a></li>
<li><a class="reference internal" href="#per-instance-context">Per-Instance Context</a></li>
<li><a class="reference internal" href="#threads">Threads</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="../numeric.html"
                        title="previous chapter">Numeric and Mathematical Modules</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="../fractions/index.html"
                        title="next chapter">fractions &#8211; Rational Numbers</a></p>
  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="../_sources/decimal/index.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="module-decimal">
<span id="decimal-fixed-and-floating-point-math"></span><h1>decimal &#8211; Fixed and floating point math<a class="headerlink" href="#module-decimal" title="Permalink to this headline">¶</a></h1>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">Purpose:</th><td class="field-body">Decimal arithmetic using fixed and floating point numbers</td>
</tr>
<tr class="field"><th class="field-name">Python Version:</th><td class="field-body">2.4 and later</td>
</tr>
</tbody>
</table>
<p>The <a class="reference internal" href="#module-decimal" title="decimal: Fixed and floating point math"><tt class="xref py py-mod docutils literal"><span class="pre">decimal</span></tt></a> module implements fixed and floating point
arithmetic using the model familiar to most people, rather than the
IEEE floating point version implemented by most computer hardware.  A
Decimal instance can represent any number exactly, round up or down,
and apply a limit to the number of significant digits.</p>
<div class="section" id="decimal">
<h2>Decimal<a class="headerlink" href="#decimal" title="Permalink to this headline">¶</a></h2>
<p>Decimal values are represented as instances of the <tt class="xref py py-class docutils literal"><span class="pre">Decimal</span></tt>
class.  The constructor takes as argument an integer, or a string.
Floating point numbers must be converted to a string before being used
to create a <tt class="xref py py-class docutils literal"><span class="pre">Decimal</span></tt>, letting the caller explicitly deal with
the number of digits for values that cannot be expressed exactly using
hardware floating point representations.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="n">fmt</span> <span class="o">=</span> <span class="s">&#39;{0:&lt;20} {1:&lt;20}&#39;</span>
<span class="k">print</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39;Input&#39;</span><span class="p">,</span> <span class="s">&#39;Output&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">20</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">20</span><span class="p">)</span>

<span class="c"># Integer</span>
<span class="k">print</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>

<span class="c"># String</span>
<span class="k">print</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">,</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">))</span>

<span class="c"># Float</span>
<span class="k">print</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="mf">0.1</span><span class="p">),</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)))</span>
</pre></div>
</div>
<p>Notice that the floating point value of <tt class="docutils literal"><span class="pre">0.1</span></tt> is not represented as
an exact value, so the representation as a float is different from the
Decimal value.</p>
<div class="highlight-python"><pre>$ python decimal_create.py

Input                Output
-------------------- --------------------
5                    5
3.14                 3.14
0.1                  0.1</pre>
</div>
<p>Less conveniently, Decimals can also be created from tuples containing
a sign flag (<tt class="docutils literal"><span class="pre">0</span></tt> for positive, <tt class="docutils literal"><span class="pre">1</span></tt> for negative), a tuple of
digits, and an integer exponent.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="c"># Tuple</span>
<span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="o">-</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&#39;Input  :&#39;</span><span class="p">,</span> <span class="n">t</span>
<span class="k">print</span> <span class="s">&#39;Decimal:&#39;</span><span class="p">,</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_tuple.py

Input  : (1, (1, 1), -2)
Decimal: -0.11</pre>
</div>
</div>
<div class="section" id="arithmetic">
<h2>Arithmetic<a class="headerlink" href="#arithmetic" title="Permalink to this headline">¶</a></h2>
<p>Decimal overloads the simple arithmetic operators so once you have a
value you can manipulate it in much the same way as the built-in
numeric types.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="n">a</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;5.1&#39;</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">)</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">d</span> <span class="o">=</span> <span class="mf">3.14</span>

<span class="k">print</span> <span class="s">&#39;a     =&#39;</span><span class="p">,</span> <span class="n">a</span>
<span class="k">print</span> <span class="s">&#39;b     =&#39;</span><span class="p">,</span> <span class="n">b</span>
<span class="k">print</span> <span class="s">&#39;c     =&#39;</span><span class="p">,</span> <span class="n">c</span>
<span class="k">print</span> <span class="s">&#39;d     =&#39;</span><span class="p">,</span> <span class="n">d</span>
<span class="k">print</span>

<span class="k">print</span> <span class="s">&#39;a + b =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
<span class="k">print</span> <span class="s">&#39;a - b =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span>
<span class="k">print</span> <span class="s">&#39;a * b =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>
<span class="k">print</span> <span class="s">&#39;a / b =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span>
<span class="k">print</span>

<span class="k">print</span> <span class="s">&#39;a + c =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">c</span>
<span class="k">print</span> <span class="s">&#39;a - c =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">-</span> <span class="n">c</span>
<span class="k">print</span> <span class="s">&#39;a * c =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">*</span> <span class="n">c</span>
<span class="k">print</span> <span class="s">&#39;a / c =&#39;</span><span class="p">,</span> <span class="n">a</span> <span class="o">/</span> <span class="n">c</span>
<span class="k">print</span>

<span class="k">print</span> <span class="s">&#39;a + d =&#39;</span><span class="p">,</span>
<span class="k">try</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">a</span> <span class="o">+</span> <span class="n">d</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">e</span>
</pre></div>
</div>
<p>Decimal operators also accept integer arguments, but floating point
values must be converted to Decimal instances.</p>
<div class="highlight-python"><pre>$ python decimal_operators.py

a     = 5.1
b     = 3.14
c     = 4
d     = 3.14

a + b = 8.24
a - b = 1.96
a * b = 16.014
a / b = 1.624203821656050955414012739

a + c = 9.1
a - c = 1.1
a * c = 20.4
a / c = 1.275

a + d = unsupported operand type(s) for +: 'Decimal' and 'float'</pre>
</div>
</div>
<div class="section" id="logarithms">
<h2>Logarithms<a class="headerlink" href="#logarithms" title="Permalink to this headline">¶</a></h2>
<p>Beyond basic arithmetic, Decimal includes methods to find the base 10
and natural logarithms.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="n">d</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&#39;d     :&#39;</span><span class="p">,</span> <span class="n">d</span>
<span class="k">print</span> <span class="s">&#39;log10 :&#39;</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">log10</span><span class="p">()</span>
<span class="k">print</span> <span class="s">&#39;ln    :&#39;</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">ln</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_log.py

d     : 100
log10 : 2
ln    : 4.605170185988091368035982909</pre>
</div>
</div>
<div class="section" id="special-values">
<h2>Special Values<a class="headerlink" href="#special-values" title="Permalink to this headline">¶</a></h2>
<p>In addition to the expected numerical values, <tt class="xref py py-class docutils literal"><span class="pre">Decimal</span></tt> can
represent several special values, including positive and negative
values for infinity, &#8220;not a number&#8221;, and zero.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">[</span> <span class="s">&#39;Infinity&#39;</span><span class="p">,</span> <span class="s">&#39;NaN&#39;</span><span class="p">,</span> <span class="s">&#39;0&#39;</span> <span class="p">]:</span>
    <span class="k">print</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;-&#39;</span> <span class="o">+</span> <span class="n">value</span><span class="p">)</span>
<span class="k">print</span>

<span class="c"># Math with infinity</span>
<span class="k">print</span> <span class="s">&#39;Infinity + 1:&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;Infinity&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&#39;-Infinity + 1:&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;-Infinity&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>

<span class="c"># Print comparing NaN</span>
<span class="k">print</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;NaN&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;Infinity&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;NaN&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</pre></div>
</div>
<p>Adding to infinite values returns another infinite value.  Comparing
for equality with NaN always returns False and comparing for
inequality always returns true.  Comparing for sort order against NaN
is undefined and results in an error.</p>
<div class="highlight-python"><pre>$ python decimal_special.py

Infinity -Infinity
NaN -NaN
0 -0

Infinity + 1: Infinity
-Infinity + 1: -Infinity
False
True</pre>
</div>
</div>
<div class="section" id="context">
<h2>Context<a class="headerlink" href="#context" title="Permalink to this headline">¶</a></h2>
<p>So far all of the examples have used the default behaviors of the
decimal module. It is possible to override settings such as the
precision maintained, how rounding is performed, error handling,
etc. All of these settings are maintained via a <em>context</em>.  Contexts
can be applied for all Decimal instances in a thread or locally within
a small code region.</p>
<div class="section" id="current-context">
<h3>Current Context<a class="headerlink" href="#current-context" title="Permalink to this headline">¶</a></h3>
<p>To retrieve the current global context, use <tt class="docutils literal"><span class="pre">getcontext()</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="k">print</span> <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_getcontext.py

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[DivisionByZero, Overflow, InvalidOperation])</pre>
</div>
</div>
<div class="section" id="precision">
<h3>Precision<a class="headerlink" href="#precision" title="Permalink to this headline">¶</a></h3>
<p>The <em>prec</em> attribute of the context controls the precision maintained
for new values created as a result of arithmetic.  Literal values are
maintained as described.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="n">d</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;0.123456&#39;</span><span class="p">)</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
    <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="n">i</span>
    <span class="k">print</span> <span class="n">i</span><span class="p">,</span> <span class="s">&#39;:&#39;</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">d</span> <span class="o">*</span> <span class="mi">1</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_precision.py

0 : 0.123456 0
1 : 0.123456 0.1
2 : 0.123456 0.12
3 : 0.123456 0.123</pre>
</div>
</div>
<div class="section" id="rounding">
<h3>Rounding<a class="headerlink" href="#rounding" title="Permalink to this headline">¶</a></h3>
<p>There are several options for rounding to keep values within the
desired precision.</p>
<dl class="docutils">
<dt>ROUND_CEILING</dt>
<dd>Always round upwards towards infinity.</dd>
<dt>ROUND_DOWN</dt>
<dd>Always round toward zero.</dd>
<dt>ROUND_FLOOR</dt>
<dd>Always round down towards negative infinity.</dd>
<dt>ROUND_HALF_DOWN</dt>
<dd>Rounds away from zero if the last significant digit is greater than
or equal to 5, otherwise toward zero.</dd>
<dt>ROUND_HALF_EVEN</dt>
<dd>Like ROUND_HALF_DOWN except that if the value is 5 then the
preceding digit is examined.  Even values cause the result to be
rounded down and odd digits cause the result to be rounded up.</dd>
<dt>ROUND_HALF_UP</dt>
<dd>Like ROUND_HALF_DOWN except if the last significant digit is 5 the
value is rounded away from zero.</dd>
<dt>ROUND_UP</dt>
<dd>Round away from zero.</dd>
<dt>ROUND_05UP</dt>
<dd>Round away from zero if the last digit is <tt class="docutils literal"><span class="pre">0</span></tt> or <tt class="docutils literal"><span class="pre">5</span></tt>, otherwise
towards zero.</dd>
</dl>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="n">context</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span>

<span class="n">ROUNDING_MODES</span> <span class="o">=</span> <span class="p">[</span> 
    <span class="s">&#39;ROUND_CEILING&#39;</span><span class="p">,</span> 
    <span class="s">&#39;ROUND_DOWN&#39;</span><span class="p">,</span>
    <span class="s">&#39;ROUND_FLOOR&#39;</span><span class="p">,</span> 
    <span class="s">&#39;ROUND_HALF_DOWN&#39;</span><span class="p">,</span> 
    <span class="s">&#39;ROUND_HALF_EVEN&#39;</span><span class="p">,</span>
    <span class="s">&#39;ROUND_HALF_UP&#39;</span><span class="p">,</span>
    <span class="s">&#39;ROUND_UP&#39;</span><span class="p">,</span>
    <span class="s">&#39;ROUND_05UP&#39;</span><span class="p">,</span>
    <span class="p">]</span>

<span class="n">header_fmt</span> <span class="o">=</span> <span class="s">&#39;{0:20} {1:^10} {2:^10} {3:^10}&#39;</span>

<span class="k">print</span> <span class="s">&#39;POSITIVES:&#39;</span>
<span class="k">print</span>

<span class="k">print</span> <span class="n">header_fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;1/8 (1)&#39;</span><span class="p">,</span> <span class="s">&#39;1/8 (2)&#39;</span><span class="p">,</span> <span class="s">&#39;1/8 (3)&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">header_fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rounding_mode</span> <span class="ow">in</span> <span class="n">ROUNDING_MODES</span><span class="p">:</span>
    <span class="k">print</span> <span class="s">&#39;{0:20}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rounding_mode</span><span class="p">),</span>
    <span class="k">for</span> <span class="n">precision</span> <span class="ow">in</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span> <span class="p">]:</span>
        <span class="n">context</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="n">precision</span>
        <span class="n">context</span><span class="o">.</span><span class="n">rounding</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">decimal</span><span class="p">,</span> <span class="n">rounding_mode</span><span class="p">)</span>
        <span class="n">value</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
        <span class="k">print</span> <span class="s">&#39;{0:&lt;10}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
    <span class="k">print</span>

<span class="k">print</span>
<span class="k">print</span> <span class="s">&#39;NEGATIVES:&#39;</span>

<span class="k">print</span> <span class="n">header_fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;-1/8 (1)&#39;</span><span class="p">,</span> <span class="s">&#39;-1/8 (2)&#39;</span><span class="p">,</span> <span class="s">&#39;-1/8 (3)&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">header_fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rounding_mode</span> <span class="ow">in</span> <span class="n">ROUNDING_MODES</span><span class="p">:</span>
    <span class="k">print</span> <span class="s">&#39;{0:20}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rounding_mode</span><span class="p">),</span>
    <span class="k">for</span> <span class="n">precision</span> <span class="ow">in</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span> <span class="p">]:</span>
        <span class="n">context</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="n">precision</span>
        <span class="n">context</span><span class="o">.</span><span class="n">rounding</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">decimal</span><span class="p">,</span> <span class="n">rounding_mode</span><span class="p">)</span>
        <span class="n">value</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
        <span class="k">print</span> <span class="s">&#39;{0:&lt;10}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
    <span class="k">print</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_rounding.py

POSITIVES:

                      1/8 (1)    1/8 (2)    1/8 (3)
                     ---------- ---------- ----------
ROUND_CEILING        0.2        0.13       0.125
ROUND_DOWN           0.1        0.12       0.125
ROUND_FLOOR          0.1        0.12       0.125
ROUND_HALF_DOWN      0.1        0.12       0.125
ROUND_HALF_EVEN      0.1        0.12       0.125
ROUND_HALF_UP        0.1        0.13       0.125
ROUND_UP             0.2        0.13       0.125
ROUND_05UP           0.1        0.12       0.125

NEGATIVES:
                      -1/8 (1)   -1/8 (2)   -1/8 (3)
                     ---------- ---------- ----------
ROUND_CEILING        -0.1       -0.12      -0.125
ROUND_DOWN           -0.1       -0.12      -0.125
ROUND_FLOOR          -0.2       -0.13      -0.125
ROUND_HALF_DOWN      -0.1       -0.12      -0.125
ROUND_HALF_EVEN      -0.1       -0.12      -0.125
ROUND_HALF_UP        -0.1       -0.13      -0.125
ROUND_UP             -0.2       -0.13      -0.125
ROUND_05UP           -0.1       -0.12      -0.125</pre>
</div>
</div>
<div class="section" id="local-context">
<h3>Local Context<a class="headerlink" href="#local-context" title="Permalink to this headline">¶</a></h3>
<p>Using Python 2.5 or later you can also apply the context to a subset
of your code using the <tt class="docutils literal"><span class="pre">with</span></tt> statement and a context manager.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="k">with</span> <span class="n">decimal</span><span class="o">.</span><span class="n">localcontext</span><span class="p">()</span> <span class="k">as</span> <span class="n">c</span><span class="p">:</span>
    <span class="n">c</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="mi">2</span>
    <span class="k">print</span> <span class="s">&#39;Local precision:&#39;</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">prec</span>
    <span class="k">print</span> <span class="s">&#39;3.14 / 3 =&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span><span class="p">)</span>

<span class="k">print</span>
<span class="k">print</span> <span class="s">&#39;Default precision:&#39;</span><span class="p">,</span> <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">prec</span>
<span class="k">print</span> <span class="s">&#39;3.14 / 3 =&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_context_manager.py

Local precision: 2
3.14 / 3 = 1.0

Default precision: 28
3.14 / 3 = 1.046666666666666666666666667</pre>
</div>
</div>
<div class="section" id="per-instance-context">
<h3>Per-Instance Context<a class="headerlink" href="#per-instance-context" title="Permalink to this headline">¶</a></h3>
<p>Contexts can be used to construct Decimal instances, applying the precision and rounding arguments to the conversion from the input type.  This lets your application select the precision of constant values separately from the precision of user data.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>

<span class="c"># Set up a context with limited precision</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">c</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="mi">3</span>

<span class="c"># Create our constant</span>
<span class="n">pi</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">create_decimal</span><span class="p">(</span><span class="s">&#39;3.1415&#39;</span><span class="p">)</span>

<span class="c"># The constant value is rounded off</span>
<span class="k">print</span> <span class="s">&#39;PI:&#39;</span><span class="p">,</span> <span class="n">pi</span>

<span class="c"># The result of using the constant uses the global context</span>
<span class="k">print</span> <span class="s">&#39;RESULT:&#39;</span><span class="p">,</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;2.01&#39;</span><span class="p">)</span> <span class="o">*</span> <span class="n">pi</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_instance_context.py

PI: 3.14
RESULT: 6.3114</pre>
</div>
</div>
<div class="section" id="threads">
<h3>Threads<a class="headerlink" href="#threads" title="Permalink to this headline">¶</a></h3>
<p>The &#8220;global&#8221; context is actually thread-local, so each thread can potentially be configured using different values.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">decimal</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">from</span> <span class="nn">Queue</span> <span class="kn">import</span> <span class="n">Queue</span>

<span class="k">class</span> <span class="nc">Multiplier</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">prec</span><span class="p">,</span> <span class="n">q</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">a</span> <span class="o">=</span> <span class="n">a</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">b</span> <span class="o">=</span> <span class="n">b</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="n">prec</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">q</span> <span class="o">=</span> <span class="n">q</span>
        <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">c</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
        <span class="n">c</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prec</span>
        <span class="n">decimal</span><span class="o">.</span><span class="n">setcontext</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">put</span><span class="p">(</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prec</span><span class="p">,</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">)</span> <span class="p">)</span>
        <span class="k">return</span>

<span class="n">a</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;3.14&#39;</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&#39;1.234&#39;</span><span class="p">)</span>
<span class="n">q</span> <span class="o">=</span> <span class="n">Queue</span><span class="p">()</span>
<span class="n">threads</span> <span class="o">=</span> <span class="p">[</span> <span class="n">Multiplier</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">q</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="p">]</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
    <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>

<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
    <span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
    <span class="n">prec</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">q</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
    <span class="k">print</span> <span class="n">prec</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">value</span>
</pre></div>
</div>
<div class="highlight-python"><pre>$ python decimal_thread_context.py

1       4
2       3.9
3       3.87
4       3.875
5       3.8748</pre>
</div>
<div class="admonition-see-also admonition seealso">
<p class="first admonition-title">See also</p>
<dl class="last docutils">
<dt><a class="reference external" href="http://docs.python.org/library/decimal.html">decimal</a></dt>
<dd>The standard library documentation for this module.</dd>
<dt><a class="reference external" href="http://en.wikipedia.org/wiki/Floating_point">Wikipedia: Floating Point</a></dt>
<dd>Article on floating point representations and arithmetic.</dd>
</dl>
</div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="../fractions/index.html" title="fractions – Rational Numbers"
             >next</a> |</li>
        <li class="right" >
          <a href="../numeric.html" title="Numeric and Mathematical Modules"
             >previous</a> |</li>
        <li><a href="../contents.html">PyMOTW</a> &raquo;</li>
          <li><a href="../numeric.html" >Numeric and Mathematical Modules</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; Copyright Doug Hellmann.
      Last updated on Oct 24, 2010.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>.

    <br/><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/" rel="license"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png"/></a>
    
    </div>
  </body>
</html>

[top] / python / PyMOTW / docs / decimal / index.html

contact | logmethods.com