kamiyonanayo / math
1.0.1
2023-12-13 16:41 UTC
Requires
- php: ^7.2 || ^8.0
- ext-json: *
Requires (Dev)
README
这是一个PHP任意精度数学库。灵感来源于Brick\Math。
与Brick/Math库的区别如下
- 可以为BigDecimal指定负缩放。
- 支持
NAN
、INF
和-INF
。 - 三种错误模式:抛出异常、
return null
和return 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