Visão geral
O tipo Decimal128 BSON é um valor de ponto flutuante baseado em decimal de 128bits capaz de emular arredondamentos decimais com precisão exata. Essa funcionalidade destina-se a aplicativos que lidam com dados monetários, como cálculos financeiros e fiscais.
A classe MongoDB\BSON\Decimal128 pode ser utilizada para trabalhar com este tipo em PHP.
Trabalhando com valores decimais128
Inserindo um Decimal128
O exemplo seguinte insere um valor do tipo Decimal128 no campo price de uma collection denominada inventory:
$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);
A saída seria então semelhante a:
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" } } }
Operações matemáticas com BMath
A extensão não fornece nenhuma funcionalidade para trabalhar com valores Decimal128; no entanto, a representação de string de um objeto MongoDB\BSON\Decimal128 pode ser utilizada com a extensão BCMath do PHP.
O exemplo seguinte adiciona dois valores Decimal128 e cria um novo valor Decimal128 com o resultado de 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);
A saída seria então semelhante a:
object(MongoDB\BSON\Decimal128)#4 (1) { ["dec"]=> string(1) "6" }
Isso não corresponde ao resultado esperado de "6.912". Cada operação na API BMath usa uma escala para determinar o número de casas decimais no resultado. A escala padrão é zero, e é por isso que o exemplo acima produz um resultado sem precisão decimal.
No exemplo a seguir, usamos uma escala de três para bcadd() para obter o resultado esperado:
$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);
A saída seria então semelhante a:
object(MongoDB\BSON\Decimal128)#4 (1) { ["dec"]=> string(5) "6.912" }
Em vez de especificar uma escala para cada operação, uma escala padrão pode ser definida por meio de bcscale() ou da configuração bcmath.scale INI. O tipo Decimal128 suporta até 34 casas decimais (ou seja, dígitos significativos).