Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
PHP 库手册
/

Decimal128

MongoDB 3.4引入了对 Decimal 128 BSON 类型的支持,该类型是基于128位十进制的浮点值,能够以精确的精度模拟十进制舍入。 此功能适用于处理货币数据(例如财务和税务计算)的应用程序。

MongoDB\ BSON\Decimal128 类可用于在PHP中处理此类型。

以下示例会将类型为 的值插入到名为Decimal128 priceinventory的collection的字段中:

<?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 值相加,并使用Decimal128 bcadd() 的结果创建一个新的 值:

<?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 中的每个操作都使用刻度来确定结果中的十进制位数。 默认小数位为零,因此上面的示例生成的结果没有小数精度。

在以下示例中,我们对 badd() 使用扩展3 来获得预期结果:

<?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设立默认扩展,而不是为每个操作指定扩展。扩展INI 设置。Decimal128 类型最多支持34 位十进制数字(即有效数字)。

后退

编解码器

在此页面上