tetthys / bc
Bc 是一款小型、简单但精确的计算工具。
Requires
- php: >=8.1
Requires (Dev)
- pestphp/pest: ^2.34
This package is auto-updated.
Last update: 2024-09-04 13:38:14 UTC
README
系统要求
- php 8.1 或更高版本
- php bcmath 扩展
Bc
Bc 是一款小型、简单但精确的计算工具。它内部使用 bcmath 函数。
你可以得到你想要的确切结果。
如果你有足够的内存,就没有四舍五入的问题。
就像用笔和纸加上你的手进行 N 位小数的计算。
为什么选择 Bc?
你认为下面的测试会通过吗?
it('shows that 0.1 + 0.2 = 0.3', function () { expect(0.1 + 0.2)->toBe(0.3); });
不幸的是,在 php 中 0.1 + 0.2 不等于 0.3
它失败的原因如下
断言失败:0.30000000000000004 与 0.3 不相同。
这就是我为什么要这样做的原因。
使用示例
计算
给出一个 scale 值后,你可以依次计算。
(new Bc)->scale(2)->num('1')->add('2')->mul('3')->value(); // '9.00'
它也可以像下面这样使用
(new Bc('1'))->add(new Bc('2'))->mul(new Bc('3'))->value(); // '9'
(new Bc)->scale(2)->num((new Bc('1')))->add(new Bc('2'))->mul(new Bc('3'))->value(); // '9.00'
比较
给出一个 scale 值后,你可以进行比较。
// true for '10.00' > '1.00' (new Bc)->scale(2)->num('10') ->isGreaterThan('1');
它也可以像下面这样使用
// true for '30.00' > '3.00' (new Bc)->scale(2)->num('10')->add('20') ->isGreaterThan((new Bc)->scale(2)->num('1')->add('2'));
关于 num
方法
它指定了计算开始的数字。它始终返回 Bc
实例。
(new Bc)->num('1')
或者你可以使用下面的方法代替
(new Bc('1'))
关于 scale
方法
它指定了一个要传递给下一个操作的 scale 值。默认值为 0。
(new Bc)->num('1')->add('2')->value(); // '3'
它支持链式调用
// With scale 0, '1' + '2' = '3' // With scale 2, '3.00' * '3.00' = '9.00' (new Bc)->num('1')->add('2')->scale(2)->mul('3')->value(); // '9.00'
支持的计算方法
计算方法期望 string
或 Bc
实例。并且它们始终返回 Bc
实例。
add
它添加一个数字
(new Bc)->num('1')->add('2')->value(); // '3'
sub
它减去一个数字
(new Bc)->num('2')->sub('1')->value(); // '1'
mul
它乘以一个数字
(new Bc)->num('2')->mul('3')->value(); // '6'
div
它除以一个数字
(new Bc)->num('6')->div('3')->value(); // '2'
mod
它计算一个数字的模
(new Bc)->num('10')->mod('7')->value(); // '3'
pow
它计算一个数字的幂
(new Bc)->num('2')->pow('3')->value(); // '8'
powmod
它计算一个数字的带模幂
(new Bc)->num('2')->powmod('5', '3')->value(); // '2'
sqrt
它计算一个数字的平方根
(new Bc)->num('9')->sqrt()->value(); // '3'
支持的比较方法
比较方法期望 string
或 Bc
实例。并且它们始终返回 bool
。
isGreaterThan
它检查一个数字是否大于另一个数字
(new Bc)->num('10')->isGreaterThan('1'); // true
isGreaterThanOrEqual
它检查一个数字是否大于或等于另一个数字
(new Bc)->num('10')->isGreaterThanOrEqual('10'); // true
isLessThan
它检查一个数字是否小于另一个数字
(new Bc)->num('1')->isLessThan('10'); // true
isLessThanOrEqual
它检查一个数字是否小于或等于另一个数字
(new Bc)->num('10')->isLessThanOrEqual('10'); // true
isEqual
它检查一个数字是否等于另一个数字
(new Bc)->num('10')->isEqual('10'); // true
isDifferent
它检查一个数字是否不同于另一个数字
(new Bc)->num('10')->isDifferent('1'); // true
gt
与 isGreaterThan
相同
(new Bc)->num('10')->gt('1'); // true
gte
与 isGreaterThanOrEqual
相同
(new Bc)->num('10')->gte('10'); // true
lt
与 isLessThan
相同
(new Bc)->num('1')->lt('10'); // true
lte
与 isLessThanOrEqual
相同
(new Bc)->num('10')->lte('10'); // true
is
与 isEqual
相同
(new Bc)->num('10')->is('10'); // true
isNot
与 isDifferent
相同
(new Bc)->num('10')->isNot('1'); // true
运行时异常
ScaleCannotBeUsedForOperation
throw new \Tetthys\Bc\Exceptions\ScaleCannotBeUsedForOperation;
当 scale 小于 0 时抛出。
ValueCannotBeUsedForOperation
throw new \Tetthys\Bc\Exceptions\ValueCannotBeUsedForOperation;
当值不是数字时抛出。
如何在相同环境中贡献和测试?
docker-compose up
docker-compose up
将 shell 连接到 phptestenv 容器
bash ./run/shell/phptestenv.sh
使用 composer 安装依赖
composer install
运行测试
./vendor/bin/pest
或者,您可以使用以下命令从主机操作系统运行测试
bash ./run/test.sh
我想说的话
现在是 2024 年 6 月。
我仍在学习提交和分支命名规范以及PHP Composer规则。
即使有些命名不好,我希望你能理解。
谢谢。