文档菜单
文档首页
/ / /
PHP库手册
/

Decimal128

在本页

  • 概述
  • 处理Decimal128值
  • 插入Decimal128
  • 使用BCMath进行数学运算

MongoDB 3.4引入了对Decimal128 BSON类型的支持,这是一种128位基于十进制的浮点值,能够以精确精度模拟十进制舍入。此功能旨在用于处理货币数据,如金融和税务计算。

可以使用此 MongoDB\BSON\Decimal128 类在 PHP 中与此类进行交互。

以下示例将类型为Decimal128 的值插入名为 inventory 的集合中的 price 字段

<?php
$collection = (new MongoDB\Client)->test->inventory;
$collection->insertOne([
'_id' => 1,
'item' => '26-inch monitor',
'price' => new MongoDB\BSON\Decimal128('428.79'),
]);
$item = $collection->findOne(['_id' => 1]);
var_dump($item);

输出将类似于

object(MongoDB\Model\BSONDocument)#9 (1) {
["storage":"ArrayObject":private]=>
array(3) {
["_id"]=>
int(1)
["item"]=>
string(15) "26-inch monitor"
["price"]=>
object(MongoDB\BSON\Decimal128)#13 (1) {
["dec"]=>
string(6) "428.79"
}
}
}

扩展不提供处理Decimal128值的功能;然而,一个MongoDB\BSON\Decimal128对象的字符串表示可以与PHP的BCMath扩展一起使用。

以下示例将两个 Decimal128 值相加,并使用从 bcadd(): 获得的结 果创建一个新的 Decimal128

<?php
$lhs = new MongoDB\BSON\Decimal128('1.234');
$rhs = new MongoDB\BSON\Decimal128('5.678');
$sum = new MongoDB\BSON\Decimal128(bcadd($lhs, $rhs));
var_dump($sum);

输出将类似于

object(MongoDB\BSON\Decimal128)#4 (1) {
["dec"]=>
string(1) "6"
}

这并不符合预期的 "6.912" 结果。BCMath API 中的每个操作都使用一个刻度来确定结果中的小数位数。默认刻度为零,这就是为什么上面的示例产生一个没有小数精度的结果。

在下面的示例中,我们为 bcadd() 使用三个刻度来获取预期的结果

<?php
$lhs = new MongoDB\BSON\Decimal128('1.234');
$rhs = new MongoDB\BSON\Decimal128('5.678');
$sum = new MongoDB\BSON\Decimal128(bcadd($lhs, $rhs, 3));
var_dump($sum);

输出将类似于

object(MongoDB\BSON\Decimal128)#4 (1) {
["dec"]=>
string(5) "6.912"
}

在为每个操作指定比例尺的情况下,可以通过 bcscale()bcmath.scale INI 设置 来设置默认的比例尺。Decimal128 类型支持高达 34 位小数(即有效数字)。

返回

编解码器