<?xml version="1.0"?>

<!--
   Copyright 2005 The Apache Software Foundation

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
  -->
  
<?xml-stylesheet type="text/xsl" href="./xdoc.xsl"?>
<!-- $Revision$ $Date$ -->
<document url="stat.html">
  <properties>
    <title>The Commons Math User Guide - Fractions</title>
  </properties>
  <body>
    <section name="9 Fractions">
      <subsection name="9.1 Overview" href="overview">
        <p>
          The fraction packages provides a fraction number type as well as
          fraction number formatting.
        </p>
      </subsection>
      <subsection name="9.2 Fraction Numbers" href="fraction">
        <p>
          <a href="../apidocs/org/apache/commons/math/fraction/Fraction.html">
          org.apache.commons.math.fraction.Fraction</a> provides a fraction number
          type that forms the basis for the fraction functionality found in 
          commons-math.
        </p>
        <p>
          To create a fraction number, simply call the constructor passing in two
          integer arguments, the first being the numerator of the fraction and the second being the denominator:
          <source>Fraction f = new Fraction(1, 3); // 1 / 3</source>
        </p>
        <p>
          Of special note with fraction construction, when a fraction is created it is always reduced to lowest terms.
        </p>
        <p>
          The <code>Fraction</code> class provides many unary and binary
          fraction operations.  These operations provide the means to add,
          subtract, multiple and, divide fractions along with other functions similar to the real number functions found in
          <code>java.math.BigDecimal</code>:
          <source>Fraction lhs = new Fraction(1, 3);
Fraction rhs = new Fraction(2, 5);

Fraction answer = lhs.add(rhs);     // add two fractions
        answer = lhs.subtract(rhs); // subtract two fractions
        answer = lhs.abs();         // absolute value
        answer = lhs.reciprocal();  // reciprocal of lhs</source>
        </p>
        <p>
          Like fraction construction, for each of the fraction functions, the resulting fraction is reduced to lowest terms.
        </p>
      </subsection>
      <subsection name="9.3 Fraction Formatting and Parsing" href="formatting">
        <p>
          <code>Fraction</code> instances can be converted to and from strings
          using the<a href="../apidocs/org/apache/commons/math/fraction/FractionFormat.html">
          org.apache.commons.math.fraction.FractionFormat</a> class.
          <code>FractionFormat</code> is a <code>java.text.Format</code>
          extension and, as such, is used like other formatting objects (e.g.
          <code>java.text.SimpleDateFormat</code>):
          <source>FractionFormat format = new FractionFormat(); // default format
Fraction f = new Fraction(2, 4);
String s = format.format(f); // s contains "1 / 2", note the reduced fraction</source>
        </p>
        <p>
          To customize the formatting output, one or two
          <code>java.text.NumberFormat</code> instances can be used to construct
          a <code>FractionFormat</code>.  These number formats control the
          formatting of the numerator and denominator of the fraction:
          <source>NumberFormat nf = NumberFormat.getInstance(Locale.FRANCE);
// create fraction format with custom number format
// when one number format is used, both numerator and
// denominator are formatted the same
FractionFormat format = new FractionFormat(nf);
Fraction f = new Fraction(2000, 3333);
String s = format.format(c); // s contains "2.000 / 3.333"

NumberFormat nf2 = NumberFormat.getInstance(Locale.US);
// create fraction format with custom number formats
format = new FractionFormat(nf, nf2);
s = format.format(f); // s contains "2.000 / 3,333"</source>
        </p>
        <p>
          Formatting's inverse operation, parsing, can also be performed by
          <code>FractionFormat</code>.  To parse a fraction from a string,
          simply call the <code>parse</code> method:
          <source>FractionFormat ff = new FractionFormat();
Fraction f = ff.parse("-10 / 21");</source>
        </p>
      </subsection>
    </section>
  </body>
</document>
