Menu Docs

Página inicial do DocsManual da Biblioteca PHP

Decimal128

Nesta página

  • Visão geral
  • Trabalhando com valores decimais128
  • Inserindo um Decimal128
  • Operações matemáticas com BMath

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 aplicações que lidam com dados monetários, como computação financeira e fiscal.

O MongoDB\BSON\Decimal128 classe, que foi introduzida no driver PHP 1.2.0, podem ser usados para trabalhar com este tipo em PHP.

O exemplo seguinte insere um valor do tipo Decimal128 no campo price de uma collection denominada inventory:

<?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);

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"
}
}
}

O driver PHP 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():

<?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);

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:

<?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);

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 Decimal128 tipo suporta até 34 casas decimais (ou seja, dígitos significativos).

← Personalizar tipos de dados