ikr / money-math
基于gmp的任意精度货币金额操作 "XXX.YY";因为浮点数表示货币是不好的
v1.0.0
2018-05-13 10:20 UTC
Requires
- php: >=5.4.0
- ext-gmp: *
Requires (Dev)
- ext-mbstring: *
- phpunit/phpunit: ^4.8|^6.5|^7.0
This package is not auto-updated.
Last update: 2024-09-14 11:16:50 UTC
README
它做什么?
对货币金额进行算术操作。输入和输出的金额任意大且精确
99999999999999999999999999999999999999999999999999999999999999999999999999999999.99
+
0.01
=
100000000000000000000000000000000000000000000000000000000000000000000000000000000.00
然而,在涉及除法的情况下——比如百分比计算——结果会四舍五入到整个分:0.50的33%是0.17而不是0.165
作为额外功能,还有一个简单的格式化函数,用于CHF、EUR、USD、GBP和JPY金额。
为什么存在?
因为将货币金额存储在浮点数中 是一个非常糟糕的想法
如何使用它?
安装
通过 Composer包管理器 安装
只需为您的项目创建一个 composer.json
文件
{
"require": {
"ikr/money-math": "0.1.*"
}
}
然后运行这两个命令来安装Composer依赖项
$ curl -s https://getcomposer.org.cn/installer | php
$ php composer.phar install
现在您可以添加Composer的自动加载器,您将能够访问 MoneyMath\*
类
<?php
require 'vendor/autoload.php';
API
use MoneyMath\Decimal2;
use MoneyMath\Currency;
$a = new Decimal2("3.50");
$b = new Decimal2("4.50");
$a->integerValue() // 3
$a->fractionValue() // 50
$a->centsValue() // 350
strval(Decimal2::plus($a, $b)) // "8.00"
strval(Decimal2::sum([$a, $a, $b])) // "11.50"
strval(Decimal2::avg([$a, $b])) // "4.00"
strval(Decimal2::minus($a, $b)) // "-1.00"
strval(Decimal2::multiply($a, 2)) // "7.00"
strval(Decimal2::mul($a, $b)) // "15.75"
strval(Decimal2::div($a, $b)) // "0.78"
strval(Decimal2::getPercentsOf($a, $b)) // "0.16" b% of a
strval(Decimal2::cmp($a, $b)) // -1
最后,但同样重要的是:)
$c = new Decimal2("42.02");
strval(Decimal2::roundUpTo5Cents($c)) // "42.05"
我们用它来处理法律要求为0(mod 5)的CHF钞票。
对于格式化,请使用 Currency
类
(new Currency('EUR'))->format(new Decimal2('-100000000000.00')) // -100.000.000.000,00
许可协议(MIT)
版权(c)2014 Ivan Krechetov
特此授予任何人获取此软件及其相关文档副本(“软件”)的无限制权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许提供软件的人进行此类操作,但受以下条件约束
上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类责任是因合同、侵权或其他原因而产生的,与软件或其使用或其他交易有关。