Decimal128
概述
MongoDB 3.4引入了对Decimal128 BSON类型的支持,这是一种128位基于十进制的浮点值,能够以精确精度模拟十进制舍入。此功能旨在用于处理货币数据,如金融和税务计算。
可以使用此 MongoDB\BSON\Decimal128 类在 PHP 中与此类进行交互。
处理 Decimal128 值
插入 Decimal128
以下示例将类型为Decimal128
的值插入名为 inventory
的集合中的 price
字段
$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中的数学运算
该扩展不提供处理Decimal128
值的功能;然而,一个MongoDB\BSON\Decimal128对象的字符串表示可以与PHP的BCMath扩展一起使用。
以下示例将两个 Decimal128
值相加,并使用从 bcadd(): 获得的结 果创建一个新的 Decimal128
值
$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() 使用三个刻度来获取预期的结果
$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 位小数(即有效数字)。