chawuciren/bignumber

使用更现代和简洁的面向对象方法,在PHP中解决超大数和浮点精度问题更加方便和直观

1.0.3 2019-06-28 03:02 UTC

This package is not auto-updated.

Last update: 2024-09-28 04:40:48 UTC


README

php-bignumber

release php downloads

关于

中文文档

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)