Decimal128
概述
MongoDB 3 。 4引入了对 Decimal 128 BSON 类型的支持,这是一个128位基于十进制的浮点值,能够模拟精确精度的十进制舍入。此功能适用于处理货币数据(例如财务和税务计算)的应用程序。
MongoDB\BSON\Decimal128 类,在 PHP 驱动程序 中引入1 。2 。0 ,可用于在 PHP 中处理此类型。
使用 Decimal128 值
插入小数点 128
以下示例会将类型为 的值插入到名为Decimal128
price
inventory
的collection的字段中:
$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" } } }
使用 BCMath 进行数学运算
PHP 驱动程序 不提供任何处理Decimal128
值的功能;但是, MongoDB\BSON\Decimal128 的字符串表示 对象可与 PHP 的 BCMath 一起使用 扩展名。
以下示例将两个Decimal128
值相加,并使用Decimal128
bcadd() 的结果创建一个新的 值:
$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 以获得预期结果:
$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 位十进制数字(即有效数字)。