Decimal128
Overview
MongoDB 3.4では、正確な精度で小数の丸めをエミュレートできる128ビットの 10 進数ベースの浮動小数点値である Decimal 128 BSON 型のサポートが導入されました。 この機能は、財務や税金の計算など、 金銭データを取り扱うアプリケーションを対象としています。
MongoDB\BSON\Decimal128 クラスは、PHP でこのタイプを操作するために使用される場合があります。
Decimal128 値の操作
Decimal128 の挿入
次の例では、 inventory
という名前のコレクションのprice
フィールドに Decimal128
型の値を挿入します。
$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" } } }
BMath による数学演算
拡張機能 Decimal128
は、 値を操作する機能を提供していません。ただし、 MongoDB\BSON\Decimal128 の string 表現 オブジェクトは PHP の BMath で使用できます 拡張機能。
次の例では、2Decimal128
つの 値を追加し、Decimal128
badd() の結果を持つ新しい 値を作成します。
$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 の各操作では、スケールを使用して結果内の小数点の桁数を決定します。 デフォルトの単位は 0 であるため、上記の例では小数精度のない結果が生成されます。
次の例では 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" }
各操作のスケールを指定する代わりに、 BC scale() 経由でデフォルトのスケールを設定できます または bmath. scale INI 設定 。Decimal128
型は最大34桁の 10 進数( 有効桁数)。