PHP任意精度数学库

1.0.1 2023-12-13 16:41 UTC

This package is auto-updated.

Last update: 2024-09-16 17:06:39 UTC


README

这是一个PHP任意精度数学库。灵感来源于Brick\Math

与Brick/Math库的区别如下

  • 可以为BigDecimal指定负缩放。
  • 支持NANINF-INF
  • 三种错误模式:抛出异常、return nullreturn NaN

安装

此库可以通过Composer安装。

composer require kamiyonanayo/math

要求

此库需要PHP 7.2或更高版本以及BCMath扩展。

概述

实例化

类构造函数不是公开的,因此您需要使用工厂方法来获取实例。

所有类都提供了valueOf()工厂方法,它接受以下类型之一。

  • Numeric实例
  • int数字
  • float数字
  • 整数的字符串表示、小数、科学记数法以及特殊的值,如"NAN""INF""+INF""-INF"

示例

BigDecimal::valueOf(123546);
BigDecimal::valueOf('654321');

BigDecimal::valueOf(1.2);
BigDecimal::valueOf('9.99');

BigDecimal::valueOf('21E+10');
BigDecimal::valueOf('-5.274e-4');

BigDecimal::valueOf('-INF');
BigDecimal::valueOf('NAN');

算术运算

$n1 = BigDecimal::valueOf('12345.671');
$n2 = BigDecimal::valueOf('11111.111');
$n3 = $n1->add($n2)->multiply(-1);
echo $n3; // -23456.782

不可变

$n1 = BigDecimal::valueOf('12345.671');
$n1->add(2);
...
echo $n1; // 12345.671

比较

$n1 = BigDecimal::valueOf('12345.671');
$n2 = BigDecimal::valueOf('11111.111');
$n1->gt($n2);   // true
$n1->eq(0);     // false
$n2->lte(100);  // false

四舍五入

BigDecimal::valueOf(1)->divide('8', 2, RoundingMode::HALF_DOWN);   // 0.12
BigDecimal::valueOf(1)->divide('8', 2, RoundingMode::HALF_UP);     // 0.13

错误模式

// NAN Return Mode (defautl)
BigDecimal::getContext()->setErrorMode(MathContext::ERROR_MODE_RETURN_NAN);
$n1 = BigDecimal::valueOf('12345');
$n1->add("ABC"); // NAN Object

// Null Return Mode
BigDecimal::getContext()->setErrorMode(MathContext::ERROR_MODE_RETURN_NULL);
$n1 = BigDecimal::valueOf('12345');
$n1->add("ABC"); // null

// throw Exception Mode
BigDecimal::getContext()->setErrorMode(MathContext::ERROR_MODE_THROW_EXCEPTION);
$n1 = BigDecimal::valueOf('12345');
$n1->add("ABC"); // NumberFormatException

待办事项

  • [ ] 支持BigDecimal#pow
  • [ ] 支持BigDecimal#sqrt
  • [ ] 支持BigDecimal#toEngineeringString​
  • [ ] 实现BigInteger
  • [ ] 实现BigRational