Точный value-объект денег для PHP 8.1+: целочисленная арифметика без ошибок float, валюты ISO 4217, распределение без потери копеек, режимы округления и защита от переполнения.

Maintainers

Package info

gitverse.ru/cloud-castle/money

Homepage

Issues

Documentation

pkg:composer/cloud-castle/money

Transparency log

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

v1.2.1 2026-07-24 04:53 UTC

This package is auto-updated.

Last update: 2026-07-30 06:06:31 UTC


README

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

CloudCastle Money

CloudCastle Money

Packagist Version Downloads PHP Version License

Точный value-объект денег для PHP 8.1+: целочисленная арифметика без ошибок плавающей точки, валюты ISO 4217, распределение без потери копеек, семь режимов округления и защита от переполнения. Критично для финтеха.

Установка

composer require cloud-castle/money

Требуется PHP 8.1+ и расширение bcmath.

Быстрый старт

<?php

use CloudCastle\Money\Money;
use CloudCastle\Money\Currency;
use CloudCastle\Money\RoundingMode;

$usd = Currency::of('USD');

$price = Money::of('19.99', $usd);          // 19.99
$total = $price->multipliedBy(3);           // 59.97
$withTax = $price->multipliedBy('1.20');    // 23.99 (округление HalfUp)

// 0.1 + 0.2 в float = 0.30000000000000004; здесь — ровно 0.30.
$sum = Money::of('0.10', $usd)->plus(Money::of('0.20', $usd));   // 0.30

// Распределение без потери копеек: 0.10 на троих → 0.04, 0.03, 0.03.
foreach (Money::of('0.10', $usd)->allocate(1, 1, 1) as $part) {
    echo $part->getAmount() . "\n";
}

// Банковское округление, сравнение, знак.
$half = Money::ofMinor(5, $usd)->dividedBy(2, RoundingMode::HalfEven);   // 0.02
$price->isGreaterThan($sum);                // true

Возможности

  • Точная арифметика в целых минорных единицах — никаких ошибок float.
  • Сложение, вычитание, умножение, деление с выбором из 7 режимов округления (HalfUp, HalfEven — банковское, Up, Down, Ceiling, Floor, HalfDown).
  • Распределение (allocate / allocateTo) по долям без потери и без появления копеек (метод наибольшего остатка).
  • Валюты ISO 4217: корректное число минорных единиц (JPY — 0, KWD — 3), произвольные валюты через Currency::custom().
  • Защита от переполнения: выход за целочисленный диапазон бросает исключение, а не искажает сумму молча.
  • Полное сравнение, предикаты знака, форматирование; иммутабельность.

Сравнение с аналогами

Все таблицы ниже сгенерированы автоматически из честных сравнительных тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов, PHP 8.1.34, без Xdebug.

1. Функциональность

Возможность🏆 CloudCastlebrickmoneyphpint¹float¹bcmath¹
Точная целочисленная арифметика без ошибок float
Распределение без потери копеек (allocate по долям)
Валюты ISO 4217 с проверкой совпадения
Режимы округления (HalfUp/HalfEven/…)
Нулевые внешние зависимости
Всего🏆 544211

2. Безопасность и корректность

Свойство🏆 CloudCastlebrickmoneyphpint¹float¹bcmath¹
Иммутабельность value-объекта
Проверка совпадения валют при операциях
Обнаружение переполнения (throw, не тихое искажение)
Распределение сохраняет полную сумму (нет потерянных копеек)
Нулевые внешние зависимости (меньше поверхность атаки)
Всего🏆 544211

3. Производительность

Создание суммы + allocate 1:1:1, 100 000 раз (минимум из 4).

РешениеВремя (мс)Итог
float¹11,2базовый уровень (не библиотека)
int¹11,4базовый уровень (не библиотека)
bcmath¹33базовый уровень (не библиотека)
🏆 CloudCastle639,7быстрейшее среди библиотек
moneyphp1 119,7аналог
brick5 115аналог

4. Потребление памяти

Пик памяти на 100 000 операций (изолированный процесс, только целевая библиотека).

РешениеПиковая память (KB)Итог
🏆 CloudCastle6 962легчайшее среди библиотек
moneyphp6 962аналог
int¹6 962базовый уровень (не библиотека)
float¹6 962базовый уровень (не библиотека)
bcmath¹6 962базовый уровень (не библиотека)
brick7 152аналог

¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.

Нативные подходы (baseline): float ТЕРЯЕТ копейку при делении (33.33×3=99.99), целые и bcmath без наивной раздачи остатка тоже теряют; из них лишь ручная целая раздача корректна, но без валют, округления и защиты value-объекта. brick/money использует произвольную точность (BigNumber) — корректно, но в разы медленнее нативной целочисленной арифметики cloud-castle. Память измеряется в изоляции.

Вывод: CloudCastle Money — самый быстрый среди money-библиотек (native-int арифметика против BigNumber у brick и строк у moneyphp), самый лёгкий по памяти, с точным распределением без потери копеек, режимами округления, защитой от переполнения и нулевыми внешними зависимостями.

Разработка

composer install
composer check    # линтеры + статический анализ + тесты
composer fix      # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci       # полный CI-пайплайн локально

Полный список команд с описаниями: composer run-script --list.

Документация

Лицензия

MIT © CloudCastle (alex-4-17@yandex.ru)

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano