chawuciren / bignumber
使用更现代和简洁的面向对象方法,在PHP中解决超大数和浮点精度问题更加方便和直观
Requires
- php: >=5.3
This package is not auto-updated.
Last update: 2024-09-28 04:40:48 UTC
README
php-bignumber
关于
PHP中的整数大小依赖于平台。通常最大值为20亿,64位平台上的最大值通常为9E18。
浮点数具有有限的精度,并依赖于系统,因此永远不要相信浮点数能精确到最后一位,也永远不要比较两个浮点数是否相等。
当业务场景需要处理大量值或需要精确处理浮点值时,应使用任意精度数学函数,例如:交易系统、电子商务系统等。
当前项目封装了任意精度数学函数,以便在PHP中更容易解决大数和浮点精度问题。
安装
首先请确保您的PHP已经安装,并且有BC Math扩展,如果没有支持,具体安装参考网站:https://php.ac.cn/manual/en/bc.installation.php
查看方式
php -info | grep bcmath
如果您可以看到输出
bcmath
bcmath.scale => 0 => 0
BC Math是可用的
开始安装
1. 方法1:通过composer
composer require chawuciren/bignumber
2. 方法2:直接下载并包含
直接下载源代码,引入src/bignumber.php
开始使用
传入的数字字符串的初始化应该使用,例如一个数值在输出到前端界面后,数据库中存储的类型为DECIMAL
,应首先初始化BigNumber
的值将被移除,然后在代码中使用BigNumber
进行计算,最后在界面中使用:value()方法进行数值输出字符串
1. 方法1:使用new语句
use \chawuciren\BigNumber;
$number = new BigNumber('0.002', 3);
2. 方法2:使用静态方法build
use \chawuciren\BigNumber;
$number = BigNumber::build('0.002', 3);
3. 方法3:使用valueOf方法赋值
use \chawuciren\BigNumber;
$number = new BigNumber();
$number->valueOf('0.002', 3);
示例
use \chawuciren\BigNumber;
$number = new BigNumber('1.0001', 4);
$number->add('0.0004')->sub('1')->mul('4')->div('5');
var_dump($number->value()); //string(5) "0.0002"
$number2 = new BigNumber('0.0002');
var_dump($number->eq($number2)) //bool true
方法列表
1.valueOf
设置值到BigNumber实例
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber();
$number->valueOf('0.002', 3);
var_dump($number); //object(chawuciren\BigNumber)
2.toString
返回一个字符串值
参数
无参数
返回值:String(当前值)
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$str = $number->toString();
var_dump($str); //string(5) "0.002"
3.value
返回一个字符串类型的值,目前是toString方法的别名
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$str = $number->value();
var_dump($str); //string(5) "0.002"
4.add
当前值加上传入的数字值
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$number->add('0.003');
var_dump($number->value()); //string(5) "0.005"
5.sub
从传入的数字值中减去当前值
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$number->sub('0.001');
var_dump($number->value()); //string(5) "0.001"
6.mul
将当前值乘以传入的数字值
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$number->sub('0.001');
var_dump($number->value()); //string(5) "0.001"
7.div
将当前值除以传入的数字值
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('0.002', 3);
$number->div('2');
var_dump($number->value()); //string(5) "0.001"
8.mod
用传入的数字值对当前值进行取模
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('108');
$number->mod('10');
var_dump($number->value()); //string(1) "8"
9.pow
将当前值提升到指定的幂
参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('2');
$number->pow('2');
var_dump($number->value()); //string(1) "4"
10.sqrt
取当前值的平方根
参数
无参数
返回值:BigNumber(当前实例)
示例
$number = new \chawuciren\BigNumber('16');
$number->sqrt();
var_dump($number->value()); //string(1) "4"
11.eq
判断当前值是否等于传入的数值
参数
返回值:Bool(True:相等;False:不相等)
示例
$number = new \chawuciren\BigNumber('0.00000000000000000001', 20);
$number2 = new \chawuciren\BigNumber('0.00000000000000000001', 20);
var_dump($number->eq($number2)); //bool(true)
12.gt
判断当前值是否大于传入的数值
参数
返回值:Bool(True:大于;False:不大于)
示例
$number = new \chawuciren\BigNumber('0.00000000000000000002', 20);
$number2 = new \chawuciren\BigNumber('0.00000000000000000001', 20);
var_dump($number->gt($number2)); //bool(true)
13.egt
判断当前值是否大于或等于传入的数值
参数
返回值:布尔值(True:大于等于;False:不大于且不等于)
示例
$number = new \chawuciren\BigNumber('0.00000000000000000002', 20);
$number2 = new \chawuciren\BigNumber('0.00000000000000000001', 20);
var_dump($number->egt($number2)); //bool(true)
14.小于
确定当前值是否小于数值
参数
返回值:布尔值(True:小于;False:不小于)
示例
$number = new \chawuciren\BigNumber('0.00000000000000000002', 20);
$number2 = new \chawuciren\BigNumber('0.00000000000000000001', 20);
var_dump($number->lt($number2)); //bool(false)
15.小于等于
确定当前值是否小于或等于数值的值
参数
返回值:布尔值(True:小于或等于;False:不小于且不等于)
示例
$number = new \chawuciren\BigNumber('0.00000000000000000002', 20);
$number2 = new \chawuciren\BigNumber('0.00000000000000000001', 20);
var_dump($number->lt($number2)); //bool(false)