Decimal128
Nesta página
Visão geral
O MongoDB 3.4 introduziu suporte para um tipo Decimal128 BSON, que é um valor de ponto flutuante baseado em decimal de 128bits capaz de emular arredondamento decimal com precisão exata. Esta funcionalidade destina-se a aplicativos que lidam comdados monetários do , como cálculos financeiros e fiscais.
O MongoDB\BSON\Decimal128 classe pode ser usada 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 Decimal128
valores ; no entanto, a representação de string de um MongoDB\BSON\Decimal128 objeto pode ser usado com o BMath do PHP extensão.
O exemplo seguinte adiciona dois Decimal128
valores e cria um novo Decimal128
valor com o resultado de bcaded():
$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 bcaded() 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 a configuração INI do bcmth.scale. O tipo Decimal128
suporta até 34 casas decimais (ou seja, dígitos significativos).