Operation
=========

.. ATTENTION:: Operations with Money objects are always immutable. See :ref:`Immutability`.

.. _addition_subtraction:

Addition & Subtraction
----------------------

Additions can be performed using ``add()``.

.. code-block:: php

    $value1 = Money::EUR(800);       // €8.00
    $value2 = Money::EUR(500);       // €5.00

    $result = $value1->add($value2); // €13.00

``add()`` accepts variadic arguments as well.

.. code-block:: php

    $value1 = Money::EUR(800);                // €8.00
    $value2 = Money::EUR(500);                // €5.00
    $value3 = Money::EUR(600);                // €6.00

    $result = $value1->add($value2, $value3); // €19.00

Subtractions can be performed using ``subtract()``.

.. code-block:: php

    $value1 = Money::EUR(800);            // €8.00
    $value2 = Money::EUR(500);            // €5.00

    $result = $value1->subtract($value2); // €3.00

``subtract()`` accepts variadic arguments as well.

.. code-block:: php

    $value1 = Money::EUR(1400);                    // €14.00
    $value2 = Money::EUR(500);                     // €5.00
    $value3 = Money::EUR(600);                     // €6.00

    $result = $value1->subtract($value2, $value3); // €3.00

.. _multiplication_division:

Multiplication & Division
-------------------------

Multiplications can be performed using ``multiply()``.

.. code-block:: php

    $value = Money::EUR(800);       // €8.00

    $result = $value->multiply(2);  // €16.00

Divisions can be performed using ``divide()``.

.. code-block:: php

    $value = Money::EUR(800);       // €8.00

    $result = $value->divide(2);    // €4.00

.. _modulus:

Modulus
-------

Modulus operations can be performed using ``mod()``.

.. code-block:: php

    $value = Money::EUR(830);        // €8.30
    $divisor = Money::EUR(300);      // €3.00

    $result = $value->mod($divisor); // €2.30

.. _rounding_modes:

Rounding Modes
--------------

A number of rounding modes are available for :ref:`multiplication_division` above.

* ``Money::ROUND_HALF_DOWN``
* ``Money::ROUND_HALF_EVEN``
* ``Money::ROUND_HALF_ODD``
* ``Money::ROUND_HALF_UP``
* ``Money::ROUND_UP``
* ``Money::ROUND_DOWN``
* ``Money::ROUND_HALF_POSITIVE_INFINITY``
* ``Money::ROUND_HALF_NEGATIVE_INFINITY``

Round to Unit
-------------

Amounts can be rounded to unit.

.. code-block:: php

    $value = Money::EUR(813);           // €8.13

    $result = $value->roundToUnit(2);   // Money::EUR(800)
    $result = $value->roundToUnit(1);   // Money::EUR(810)

.. _absolute:

Absolute Value
--------------

``absolute()`` provides the absolute value of a Money object.

.. code-block:: php

    $value = Money::EUR(-800);       // -€8.00

    $result = $value->absolute();    // €8.00

.. _ratio_of:

Ratio Of
--------

``ratioOf()`` provides the ratio of a Money object in comparison to another Money object.

.. code-block:: php

    $three = Money::EUR(300);        // €3.00
    $six = Money::EUR(600);          // €6.00

    $result = $three->ratioOf($six); // 0.5
    $result = $six->ratioOf($three); // 2
