fortis / moneyobject
一个提供不可变 Money 值对象的 PHP 库
1.0.11
2021-02-14 20:20 UTC
Requires
- php: >=5.6
- brick/math: ^0.9.2
- fortis/iso-currency: ^1.0
Requires (Dev)
- phpunit/phpunit: 9.5.2
README
一个提供任意精度不可变 Money 值对象和解决浮点数舍入错误的 PHP 库。
你认为以下示例会打印出什么内容?
print (36 - 35.99) === 0.01 ? '✅ equals' : 'not equals 😈';
实际上 不相等 😈 。你可以尝试 https://ideone.com/2UQlBF。
将无限多个实数压缩到有限数量的位需要近似表示。尽管有无限多个整数,但在大多数程序中,整数运算的结果可以存储在 32 位中。相比之下,给定任何固定数量的位,大多数实数计算的结果都不能用这么多位精确表示。因此,浮点计算的结果通常需要舍入才能适应其有限的表示。这种舍入误差是浮点计算的特征。
-- Oracle
安装
使用 Composer 在命令行中直接安装
composer require fortis/moneyobject
快速入门
货币代码验证
$money = new Money(100, 'USF'); // throws InvalidCurrencyException
创建 Money 实例
$money = Money::USD(100.20); // 100.20 USD. Short syntax with autocomplete. $money = new Money(100.20, CurrencyCode::USD); // 100.20 USD $money = Money::create(100.20, CurrencyCode::USD); // 100.20 USD
获取货币
$money->getCurrency()->getCode(); // USD
获取金额
$money->getAmount()->toFloat(); // 100.20
乘法:100.20 * 2
$money->multiply(2) ->getAmount()->toFloat(); // 200.40
除法:100.20 / 2
$money->divide(Money::USD(2)) ->getAmount()->toFloat(); // 50.10
加法:100.20 + 2.5
$money->plus(Money::USD(2.5)) ->getAmount()->toFloat(); // 102.70
减法:100.20 - 0.5
$money->minus(Money::USD(0.5)) ->getAmount()->toFloat(); // 99.70
减法:36 - 35.99
Money::USD(36)->minus(Money::USD(35.99)) ->getAmount()->toFloat(); // 0.01
减法:36 - 35.99
Money::USD(36)->minus(35.99) ->getAmount()->toFloat(); // 0.01
将 USD 转换为 EUR
$ composer require florianv/swap php-http/message php-http/guzzle6-adapter
$swap = (new SwapBuilder()) ->add('fixer') ->build(); $converter = new Converter($swap); $usd50 = Money::USD(50); $result = $converter->convert($usd50, Currency::EUR());
鸣谢
许可证
moneyobject 在 MIT 许可证下授权。