Changelog

All notable changes to this project will be documented in this file.

0.14.8 - 2026-02-10

🗑️ Deprecations

New features

👌 Improvements

0.14.7 - 2026-02-07

New features

👌 Improvements

0.14.6 - 2026-02-05

🗑️ Deprecations

👌 Improvements

0.14.5 - 2026-02-03

🗑️ Deprecations

New features

👌 Improvements

0.14.4 - 2026-02-02

🗑️ Deprecations

New features

👌 Improvements

0.14.3 - 2026-02-01

New features

🐛 Bug fixes

0.14.2 - 2026-01-30

🗑️ Deprecations

New features

👌 Improvements

🐛 Bug fixes

0.14.1 - 2025-11-24

New features

Compatibility fixes

0.14.0 - 2025-08-29

New features

Improvements

💥 Breaking changes

0.13.1 - 2025-03-29

Improvements

0.13.0 - 2025-03-03

💥 Breaking changes

New features

0.12.3 - 2025-02-28

New features

0.12.2 - 2025-02-26

⚡️ Performance improvements

👌 Improvements

0.12.1 - 2023-11-29

⚡️ Performance improvements

0.12.0 - 2023-11-26

💥 Breaking changes

0.11.0 - 2023-01-16

💥 Breaking changes

* You may now run into type errors if you were passing Stringable objects to of() or any of the methods internally calling of(), with strict_types enabled. You can fix this by casting Stringable objects to string first.

0.10.2 - 2022-08-11

👌 Improvements

0.10.1 - 2022-08-02

New features

0.10.0 - 2022-06-18

💥 Breaking changes

0.9.3 - 2021-08-15

🚀 Compatibility with PHP 8.1

0.9.2 - 2021-01-20

🐛 Bug fix

0.9.1 - 2020-08-19

New features

🐛 Bug fixes

0.9.0 - 2020-08-18

👌 Improvements

💥 Breaking changes

0.8.17 - 2020-08-19

🐛 Bug fix

0.8.16 - 2020-08-18

🚑 Critical fix

New features

💩 Deprecations

0.8.15 - 2020-04-15

🐛 Fixes

⚡️ Optimizations

0.8.14 - 2020-02-18

New features

0.8.13 - 2020-02-16

New features

0.8.12 - 2020-02-03

🛠️ Maintenance release

Classes are now annotated for better static analysis with psalm.

This is a maintenance release: no bug fixes, no new features, no breaking changes.

0.8.11 - 2020-01-23

New feature

BigInteger::powerMod() performs a power-with-modulo operation. Useful for crypto.

0.8.10 - 2020-01-21

New feature

BigInteger::mod() returns the modulo of two numbers. The modulo differs from the remainder when the signs of the operands are different.

0.8.9 - 2020-01-08

⚡️ Performance improvements

A few additional optimizations in BigInteger and BigDecimal when one of the operands can be returned as is. Thanks to @tomtomsen in #24.

0.8.8 - 2019-04-25

🐛 Bug fixes

New features

These methods can be used as the foundation to convert strings between different bases/alphabets, using BigInteger as an intermediate representation.

💩 Deprecations

BigInteger::fromBase() works the same way as parse(), with 2 minor differences:

0.8.7 - 2019-04-20

Improvements

You can expect at least a 3x performance improvement for common arithmetic operations when using the library on systems without GMP or BCMath; it gets exponentially faster on multiplications with a high number of digits. This is due to calculations now being performed on whole blocks of digits (the block size depending on the platform, 32-bit or 64-bit) instead of digit-by-digit as before.

0.8.6 - 2019-04-11

New method

BigNumber::sum() returns the sum of one or more numbers.

0.8.5 - 2019-02-12

Bug fix: of() factory methods could fail when passing a float in environments using a LC_NUMERIC locale with a decimal separator other than '.' (#20).

Thanks @manowark 👍

0.8.4 - 2018-12-07

New method

BigDecimal::sqrt() calculates the square root of a decimal number, to a given scale.

0.8.3 - 2018-12-06

New method

BigInteger::sqrt() calculates the square root of a number (thanks @peter279k).

New exception

NegativeNumberException is thrown when calling sqrt() on a negative number.

0.8.2 - 2018-11-08

Performance update

0.8.1 - 2018-11-07

Performance optimization of toInt() methods.

0.8.0 - 2018-10-13

Breaking changes

The following deprecated methods have been removed. Use the new method name instead:

Method removed Replacement method
BigDecimal::getIntegral() BigDecimal::getIntegralPart()
BigDecimal::getFraction() BigDecimal::getFractionalPart()

New features

BigInteger has been augmented with 5 new methods for bitwise operations:

New method Description
and() performs a bitwise AND operation on two numbers
or() performs a bitwise OR operation on two numbers
xor() performs a bitwise XOR operation on two numbers
shiftedLeft() returns the number shifted left by a number of bits
shiftedRight() returns the number shifted right by a number of bits

Thanks to @DASPRiD 👍

0.7.3 - 2018-08-20

New method: BigDecimal::hasNonZeroFractionalPart()

Renamed/deprecated methods:

0.7.2 - 2018-07-21

Performance update

BigInteger::parse() and toBase() now use GMP’s built-in base conversion features when available.

0.7.1 - 2018-03-01

This is a maintenance release, no code has been changed.

This will help make installations more compact.

0.7.0 - 2017-10-02

Methods renamed:

Classes renamed:

0.6.2 - 2017-10-02

The base class for all exceptions is now MathException. ArithmeticException has been deprecated, and will be removed in 0.7.0.

0.6.1 - 2017-10-02

A number of methods have been renamed:

The old methods will be removed in version 0.7.0.

0.6.0 - 2017-08-25

0.5.4 - 2016-10-17

BigNumber classes now implement JsonSerializable. The JSON output is always a string.

0.5.3 - 2016-03-31

This is a bugfix release. Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6.

0.5.2 - 2015-08-06

The $scale parameter of BigDecimal::dividedBy() is now optional again.

0.5.1 - 2015-07-05

New method: BigNumber::toScale()

This allows to convert any BigNumber to a BigDecimal with a given scale, using rounding if necessary.

0.5.0 - 2015-07-04

New features - Common BigNumber interface for all classes, with the following methods: - sign() and derived methods (isZero(), isPositive(), …) - compareTo() and derived methods (isEqualTo(), isGreaterThan(), …) that work across different BigNumber types - toBigInteger(), toBigDecimal(), toBigRational() conversion methods - toInteger() and toFloat() conversion methods to native types - Unified of() behaviour: every class now accepts any type of number, provided that it can be safely converted to the current type - New method: BigDecimal::exactlyDividedBy(); this method automatically computes the scale of the result, provided that the division yields a finite number of digits - New methods: BigRational::quotient() and remainder() - Fine-grained exceptions: DivisionByZeroException, RoundingNecessaryException, NumberFormatException - Factory methods zero(), one() and ten() available in all classes - Rounding mode reintroduced in BigInteger::dividedBy()

This release also comes with many performance improvements.


Breaking changes - BigInteger: - getSign() is renamed to sign() - toString() is renamed to toBase() - BigInteger::dividedBy() now throws an exception by default if the remainder is not zero; use quotient() to get the previous behaviour - BigDecimal: - getSign() is renamed to sign() - getUnscaledValue() is renamed to unscaledValue() - getScale() is renamed to scale() - getIntegral() is renamed to integral() - getFraction() is renamed to fraction() - divideAndRemainder() is renamed to quotientAndRemainder() - dividedBy() now takes a mandatory $scale parameter before the rounding mode - toBigInteger() does not accept a $roundingMode parameter anymore - toBigRational() does not simplify the fraction anymore; explicitly add ->simplified() to get the previous behaviour - BigRational: - getSign() is renamed to sign() - getNumerator() is renamed to numerator() - getDenominator() is renamed to denominator() - of() is renamed to nd(), while parse() is renamed to of() - Miscellaneous: - ArithmeticException is moved to an Exception\ sub-namespace - of() factory methods now throw NumberFormatException instead of InvalidArgumentException

0.4.3 - 2016-03-31

Backport of two bug fixes from the 0.5 branch: - BigInteger::parse() did not always throw InvalidArgumentException as expected - Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6.

0.4.2 - 2015-06-16

New method: BigDecimal::stripTrailingZeros()

0.4.1 - 2015-06-12

Introducing a BigRational class, to perform calculations on fractions of any size.

0.4.0 - 2015-06-12

Rounding modes have been removed from BigInteger, and are now a concept specific to BigDecimal.

BigInteger::dividedBy() now always returns the quotient of the division.

0.3.5 - 2016-03-31

Backport of two bug fixes from the 0.5 branch:

0.3.4 - 2015-06-11

New methods: - BigInteger::remainder() returns the remainder of a division only - BigInteger::gcd() returns the greatest common divisor of two numbers

0.3.3 - 2015-06-07

Fix toString() not handling negative numbers.

0.3.2 - 2015-06-07

BigInteger and BigDecimal now have a getSign() method that returns: - -1 if the number is negative - 0 if the number is zero - 1 if the number is positive

0.3.1 - 2015-06-05

Minor performance improvements

0.3.0 - 2015-06-04

The $roundingMode and $scale parameters have been swapped in BigDecimal::dividedBy().

0.2.2 - 2015-06-04

Stronger immutability guarantee for BigInteger and BigDecimal.

So far, it would have been possible to break immutability of these classes by calling the unserialize() internal function. This release fixes that.

0.2.1 - 2015-06-02

Added BigDecimal::divideAndRemainder()

0.2.0 - 2015-05-22

0.1.1 - 2014-09-01

0.1.0 - 2014-08-31

First beta release.