jedstrom / php-decimal
PHP Decimal Type implementation
Requires
- php: >=5.5.0
- ext-bcmath: *
Requires (Dev)
- phpunit/phpunit: ^5.0
This package is not auto-updated.
Last update: 2024-10-26 19:26:25 UTC
README
A PHP Decimal Type implementation
A value object class that utilizes BCMath functions to perform arbitrary precision arithmetic operations.
Usage
Supported Operations
The following operations are currently supported:
- Addition
- Subtraction
- Multiplication
- Division
Source
$termOne = new Decimal('2', 2);
$termTwo = new Decimal('3', 0);
var_dump($termOne->add($termTwo)->getValue());
var_dump($termOne->subtract($termTwo)->getValue());
var_dump($termOne->multiply($termTwo)->getValue());
var_dump($termOne->divide($termTwo)->getValue());
// refer to Mixed Precision Calculations section
var_dump($termTwo->add($termOne)->getValue());
var_dump($termTwo->subtract($termOne)->getValue());
var_dump($termTwo->multiply($termOne)->getValue());
var_dump($termTwo->divide($termOne)->getValue());
Output
string(4) "5.00"
string(4) "-1.00"
string(4) "6.00"
string(4) "0.66"
string(4) "5"
string(4) "1"
string(4) "6"
string(4) "2"
Automatic Precision Determination
If the precision is not explicitly set, the precision required to represent the value will be automatically calculated.
Source
$decimal = new Decimal('3.14159');
var_dump($decimal->getPrecision());
Output
int(5)
Rounding Methodology
Rounding is performed using the half away from zero method.
Source
$termOne = new Decimal('1');
$termTwo = new Decimal('1.5');
$product = $termOne->multiply($termTwo);
var_dump($product->getValue());
Output
string(1) "2"
Source
$termOne = new Decimal('-1');
$termTwo = new Decimal('1.5');
$product = $termOne->multiply($termTwo);
var_dump($product->getValue());
Output
string(1) "-2"
Precision Truncation
If a precision is explicitly specified and the value specified requires more precision than specified, the value will be rounded to the specified precision.
Source
$decimal = new Decimal('3.14159', 3);
var_dump($decimal->getValue());
Output
string(5) "3.142"
Mixed Precision Calculations
Calculations are performed internally at the maximum precision of either term + 1 and then rounded to the precision of the first term.
So, in the following example:
19.99 x 0.07125
The internal result is:
1.424287
And the output is rounded to the precision of the first term (19.99 => 2) to produce:
1.42
Source
$price = new Decimal('19.99', 2);
$taxRate = new Decimal('0.07125', 5');
$tax = $price->multiply($taxRate);
var_dump($tax);
Output
string(4) "1.42"