fortis/moneyobject

一个提供不可变 Money 值对象的 PHP 库

1.0.11 2021-02-14 20:20 UTC

This package is auto-updated.

Last update: 2024-09-15 04:10:43 UTC


README

Travis Scrutinizer Code Quality Coveralls Packagist FOSSA Status

一个提供任意精度不可变 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 许可证下授权。

FOSSA Status