prestashop / decimal
BC Math PHP 扩展的对象封装/垫片。允许进行任意精度数学运算。
1.5.0
2022-02-02 09:04 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpstan/phpstan: ^0.12.99
- phpunit/phpunit: 8.*
- prestashop/php-dev-tools: ^4.1
This package is auto-updated.
Last update: 2024-08-26 19:42:45 UTC
README
一个面向对象的 BC Math 扩展 封装/垫片。
Decimal 提供了一个无状态的、流畅的对象封装实现基本的任意精度算术,如果可用,则使用 BC Math。
有关浮点精度更多信息,请参阅 此处。
示例
use PrestaShop\Decimal\DecimalNumber; use PrestaShop\Decimal\Operation\Rounding; echo (new DecimalNumber('0.1')) ->plus(new DecimalNumber('0.7')) ->times(new DecimalNumber('10')) ->round(0, Rounding::ROUND_FLOOR) // echoes '8'
安装
通过 Composer
$ composer require prestashop/decimal
使用参考
快速链接
实例化
创建一个新的 Decimal 数字。
public __construct ( string $number [, int $exponent = null ] ): DecimalNumber
有两种方法来实例化 Decimal\DecimalNumber
// create a number from string $number = new PrestaShop\Decimal\DecimalNumber('123.456'); echo $number; // echoes '123.456'
// exponent notation $number = new PrestaShop\Decimal\DecimalNumber('123456', -3); echo $number; // echoes '123.456'
加法
返回将另一个数字添加到当前数字的运算结果。
public DecimalNumber::plus ( DecimalNumber $addend ): DecimalNumber
示例
$a = new PrestaShop\Decimal\DecimalNumber('123.456'); $b = new PrestaShop\Decimal\DecimalNumber('654.321'); echo $a->plus($b); // echoes '777.777'
减法
返回从当前数字减去另一个数字的运算结果。
public DecimalNumber::minus ( DecimalNumber $subtrahend ): DecimalNumber
示例
$a = new PrestaShop\Decimal\DecimalNumber('777.777'); $b = new PrestaShop\Decimal\DecimalNumber('654.321'); echo $a->minus($b); // echoes '123.456'
乘法
返回当前数字与另一个数字相乘的运算结果。
public DecimalNumber::times ( DecimalNumber $factor ): DecimalNumber
示例
$a = new PrestaShop\Decimal\DecimalNumber('777.777'); $b = new PrestaShop\Decimal\DecimalNumber('654.321'); echo $a->times($b); // echoes '508915.824417'
除法
返回将当前数字除以另一个数字的运算结果,最多有特定数量的小数位数(默认为6)。
public DecimalNumber::dividedBy ( DecimalNumber $divisor [, int $precision = Operation\Division::DEFAULT_PRECISION ] )
示例
$a = new PrestaShop\Decimal\DecimalNumber('777.777'); $b = new PrestaShop\Decimal\DecimalNumber('654.321'); echo $a->dividedBy($b, 0); // echoes '1' echo $a->dividedBy($b, 5); // echoes '1.18867' echo $a->dividedBy($b, 10); // echoes '1.1886780341' echo $a->dividedBy($b, 15); // echoes '1.188678034175886'
比较
返回比较断言的结果。
$a = new PrestaShop\Decimal\DecimalNumber('777.777'); $b = new PrestaShop\Decimal\DecimalNumber('654.321'); $a->equals($b); // returns false $a->isLowerThan($b); // returns false $a->isLowerOrEqualThan($b); // returns false $a->isGreaterThan($b); // returns true $a->isGreaterOrEqualThan($b); // returns true // shortcut methods $a->equalsZero(); // returns false $a->isLowerThanZero(); // returns false $a->isLowerOrEqualThanZero(); // returns false $a->isGreaterThanZero(); // returns true $a->isGreaterOrEqualThanZero(); // returns true
固定精度
返回数字作为字符串,可选四舍五入,具有精确的小数位数。
public DecimalNumber::toPrecision ( int $precision [, string $roundingMode = Rounding::ROUND_TRUNCATE ] ): string
示例
$a = new PrestaShop\Decimal\DecimalNumber('123.456'); $a = new PrestaShop\Decimal\DecimalNumber('-123.456'); // truncate / pad $a->toPrecision(0); // '123' $a->toPrecision(1); // '123.4' $a->toPrecision(2); // '123.45' $a->toPrecision(3); // '123.456' $a->toPrecision(4); // '123.4560' $b->toPrecision(0); // '-123' $b->toPrecision(1); // '-123.4' $b->toPrecision(2); // '-123.45' $b->toPrecision(3); // '-123.456' $b->toPrecision(4); // '-123.4560' // ceil (round up) $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '124' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '123.5' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '123.46' $b->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '-122' $b->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '-123.3' $b->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_CEIL); // '-123.44' // floor (round down) $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '123.4' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '123.45' $b->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '-124' $b->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '-123.5' $b->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_FLOOR); // '-123.46' // half-up (symmetric half-up) $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '123.5' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '123.46' $b->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '-123' $b->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '-123.5' $b->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_UP); // '-123.46' // half-down (symmetric half-down) $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '123.4' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '123.46' $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '-123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '-123.4' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_DOWN); // '-123.46' // half-even $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '123.4' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '123.46' $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '-123' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '-123.4' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '-123.46' $a = new PrestaShop\Decimal\DecimalNumber('1.1525354556575859505'); $a->toPrecision(0, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1' $a->toPrecision(1, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.2' $a->toPrecision(2, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.15' $a->toPrecision(3, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.152' $a->toPrecision(4, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.1525' $a->toPrecision(5, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.15255' $a->toPrecision(6, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.152535' $a->toPrecision(7, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.1525354' $a->toPrecision(8, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.15253546' $a->toPrecision(9, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.152535456' $a->toPrecision(10, PrestaShop\Decimal\Operation\Rounding::ROUND_HALF_EVEN); // '1.1525354556'
四舍五入
四舍五入的行为类似于 toPrecision,但提供“最多”特定数量的小数位数(它不会添加尾随零)。
public DecimalNumber::round ( int $maxDecimals [, string $roundingMode = Rounding::ROUND_TRUNCATE ] ): string
示例
$a = new PrestaShop\Decimal\DecimalNumber('123.456'); $a = new PrestaShop\Decimal\DecimalNumber('-123.456'); // truncate / pad $a->round(0); // '123' $a->round(1); // '123.4' $a->round(2); // '123.45' $a->round(3); // '123.456' $a->round(4); // '123.456' $b->round(0); // '-123' $b->round(1); // '-123.4' $b->round(2); // '-123.45' $b->round(3); // '-123.456' $b->round(4); // '-123.456'
小数点移动
创建一个新的数字副本,该数字乘以 10^exponent
public DecimalNumber::toMagnitude ( int $exponent ): DecimalNumber
示例
$a = new PrestaShop\Decimal\DecimalNumber('123.456789'); // shift 3 digits to the left $a->toMagnitude(-3); // 0.123456789 // shift 3 digits to the right $a->toMagnitude(3); // 123456.789
有用的方法
$number = new PrestaShop\Decimal\DecimalNumber('123.45'); $number->getIntegerPart(); // '123' $number->getFractionalPart(); // '45' $number->getPrecision(); // '2' (number of decimals) $number->getSign(); // '' ('-' if the number was negative) $number->getExponent(); // '2' (always positive) $number->getCoefficient(); // '123456' $number->isPositive(); // true $number->isNegative(); // false $number->invert(); // new Decimal\DecimalNumber('-123.45')
测试
$ composer install $ vendor/bin/phpunit
贡献
请参阅 CONTRIBUTING 了解详细信息。
致谢
许可
MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。