phpexperts/money

一个用于精确处理货币数据类型的PHP库。避免浮点数舍入错误。

v2.1.0 2023-07-23 17:19 UTC

This package is auto-updated.

Last update: 2024-08-23 19:39:34 UTC


README

TravisCI Maintainability Test Coverage

MoneyType是PHP Experts, Inc.的项目,旨在精确追踪货币,甚至高达数百万美元。

将货币存储为浮点数或整数乘以一百绝对不安全。本项目为您提供所需的安全保障,以确保类似"Office Space"中的错误不会发生在您的企业应用程序中。

安装

通过Composer

composer require phpexperts/money

用法

use PHPExperts\MoneyType\Money;

$money = new Money(5.22);

$money->add(0.55);
echo "$money\n"; // 5.77

# It keeps precision much much better than mere cents.
$money->subtract(0.0001);
echo "$money\n"; // 5.77
$money->subtract(0.004);
echo "$money\n"; // 5.77
$money->subtract(0.001);
echo "$money\n"; // 5.76

# Actually, to the tenth decimal place.
# So it's Cryptocurrency-ready!
$money->multiply(55.7773);
echo "$money\n"; // 321.55

# But deep down, it stores the true values to many decimals (if you use BCMath).
echo $money->getWithFullPrecision() . "\n"; // 321.5508738395

$money->divide('1.000005');
echo "$money\n"; // 321.55
echo $money->getWithFullPrecision() . "\n"; // 321.5492660931

# You can also compare really large numbers with one another, up to 10 decimal places.
# PHP Experts' MoneyType is cryptocurrency ready! In fact, that's what it was designed for!
$money->compare(321.5492660931);       // 0 = equal
$money->compare(321.549266093009);     // -1 = less
$money->compare(321.5492660931000001); // 1 = more

# Get the object.
print_r($money);

# It is cryptocurrency ready:
# Converts Bitcoins to Satoshis
$btc = '1.55527331';
$satoshis = NumberHelper::convertToCents($btc, 8); // 155527331 (int)

用例

PHPExperts\MoneyType\Money
✔ 只能使用数字字符串实例化
✔ 将报告正在使用的策略
✔ 如果可用,将使用BCMath
✔ 如果需要,将回退到原生PHP
✔ 将所有操作代理到其计算策略
✔ 确认readme示例可以正常工作

PHPExperts\MoneyType\Internal\BCMathCalcStrategy
✔ 可以获得超过十六位的完整精度值
✔ 可以进行高精度加法
✔ 可以进行高精度减法
✔ 可以进行高精度乘法
✔ 可以进行高精度除法
✔ 可以进行高精度比较
✔ 可以计算高精度模数
✔ 可以计算小数的模数
✔ 可以进行高精度四舍五入
✔ 只能使用数字字符串实例化
✔ 可以通过字符串访问对象以获取其估值
✔ 可以进行分精度加法
✔ 可以进行分精度减法
✔ 可以进行分精度乘法
✔ 可以进行分精度除法
✔ 可以进行分精度比较
✔ 任何操作都不会接受非数字

PHPExperts\MoneyType\Internal\NativeCalcStrategy
✔ 不会尝试使用非数字进行操作
✔ 可以获得两位小数的完整精度值
✔ 无法计算小数的模数
✔ 如果要求计算整数模数,将抛出异常
✔ 如果开发人员传递"i am a dummy parameter",则可以计算整数的模数
✔ 只能使用数字字符串实例化
✔ 可以通过字符串访问对象以获取其估值
✔ 可以进行分精度加法
✔ 可以进行分精度减法
✔ 可以进行分精度乘法
✔ 可以进行分精度除法
✔ 可以进行分精度比较
✔ 任何操作都不会接受非数字

PHPExperts\MoneyType\Internal\NumberHelper:一组用于数字操作的函数。
✔ 如果给定浮点数则返回true
✔ 如果给定浮点数字符串则返回true
✔ 如果给定整数则返回false
✔ 如果给定整数字符串则返回false
✔ 如果给定其他任何东西则抛出异常
✔ 可以在不损失精度的前提下将美元转换为分整数
✔ 可以将比特币转换为satoshis

测试

phpunit

贡献者

Theodore R. Smith theodore@phpexperts.pro
GPG指纹:4BF8 2613 1C34 87AC D28F 2AD8 EB24 A91D D612 5690
首席执行官:PHP Experts, Inc.

[Alix Axel]
他为我们的"bcround()"函数贡献了基础版本,该函数来自https://stackoverflow.com/a/1653826/430062

许可证

MIT许可证。有关更多信息,请参阅许可证文件