123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <?php
- namespace app\common\library;
- /**
- * BC数学函数工具类
- * 用于高精度财务计算
- */
- class BcMath
- {
- /**
- * 默认小数位数
- */
- const DEFAULT_SCALE = 2;
- /**
- * 加法运算
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function add($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return bcadd(strval($left), strval($right), $scale);
- }
- /**
- * 减法运算
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function sub($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return bcsub(strval($left), strval($right), $scale);
- }
- /**
- * 乘法运算
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function mul($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return bcmul(strval($left), strval($right), $scale);
- }
- /**
- * 除法运算
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function div($left, $right, $scale = self::DEFAULT_SCALE)
- {
- if (strval($right) === '0' || strval($right) === '0.00') {
- return '0.00';
- }
- return bcdiv(strval($left), strval($right), $scale);
- }
- /**
- * 比较运算
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return int 1表示left>right,0表示相等,-1表示left<right
- */
- public static function comp($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return bccomp(strval($left), strval($right), $scale);
- }
- /**
- * 格式化金额为标准格式
- * @param string|float|int $amount
- * @param int $scale
- * @return string
- */
- public static function format($amount, $scale = self::DEFAULT_SCALE)
- {
- return bcadd(strval($amount), '0', $scale);
- }
- /**
- * 确保金额不为负数
- * @param string|float|int $amount
- * @param int $scale
- * @return string
- */
- public static function max($amount, $scale = self::DEFAULT_SCALE)
- {
- $formatted = self::format($amount, $scale);
- if (self::comp($formatted, '0', $scale) >= 0) {
- return $formatted;
- }
-
- // 返回0.00格式
- return $scale > 0 ? '0.' . str_repeat('0', $scale) : '0';
- }
- /**
- * 计算百分比
- * @param string|float|int $amount
- * @param string|float|int $percentage
- * @param int $scale
- * @return string
- */
- public static function percentage($amount, $percentage, $scale = self::DEFAULT_SCALE)
- {
- return self::div(self::mul($amount, $percentage, $scale + 2), '100', $scale);
- }
- /**
- * 检查金额是否大于0
- * @param string|float|int $amount
- * @return bool
- */
- public static function isPositive($amount)
- {
- return self::comp($amount, '0') > 0;
- }
- /**
- * 检查金额是否等于0
- * @param string|float|int $amount
- * @return bool
- */
- public static function isZero($amount)
- {
- return self::comp($amount, '0') === 0;
- }
- /**
- * 获取两个金额中的最大值
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function maxValue($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return self::comp($left, $right, $scale) >= 0 ? self::format($left, $scale) : self::format($right, $scale);
- }
- /**
- * 获取两个金额中的最小值
- * @param string|float|int $left
- * @param string|float|int $right
- * @param int $scale
- * @return string
- */
- public static function minValue($left, $right, $scale = self::DEFAULT_SCALE)
- {
- return self::comp($left, $right, $scale) <= 0 ? self::format($left, $scale) : self::format($right, $scale);
- }
- }
|