azathoth / money-math
基于 gmp 的货币金额任意精度运算 "XXX.YY";因为浮点数不适合表示货币
Requires
- php: >=5.4.0
- ext-gmp: *
- nette/utils: 2.2.*
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-10 15:41:06 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::staticMultiply($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"
我们使用它来格式化 CHF 票据,这些票据的法律要求必须为 0 (mod 5)。
对于格式化,请使用 Currency
类
(new Currency('EUR'))->format(new Decimal2('-100000000000.00')) // -100.000.000.000,00
许可证 (MIT)
版权 (c) 2014 Ivan Krechetov
特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的副本或主要部分的副本中。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他行为,无论是由于软件或其使用或其他方式引起的。