PHPでは、高精度計算を扱う場合、いくつかの特別な機能ライブラリに依存することができます。BCMATHはその1つです。 BCMATHは、 BCMUL()やBCDIV()を含む高精度の浮動小数点および整数操作を処理するための複数の関数を提供します。
この記事では、 bcmul()とbcdiv()を使用して、実際のケースを通じて高精度計算を達成する方法を示します。それらの基本的な使用と利点を理解することは、開発者の精度要件を改善するための重要なステップです。
PHPのデフォルトのフローティングポイント数タイプ( FLOAT )は、ほとんどの数値操作を処理できますが、非常に大きな値または非常に小さな値に直面すると、精度の損失を引き起こす可能性があります。高精度操作の結果を確保するために、 BCMATH拡張は任意の精度の数値計算サポートを提供し、従来のデータ型に制限されることなく正確な計算を実行できるようにします。
BCMUL()は、 BCMATH拡張機能の乗算関数であり、2つの高精度番号を掛けるために使用されます。従来の乗算操作とは異なり、 BCMUL()を使用すると、精度が不十分なため、結果エラーを防ぐために計算の精度を設定できます。
<span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$left_operand</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$right_operand</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$scale</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$ left_operand :最初のオペランドは、文字列として渡されました。
$ right_operand :2番目のオペランドも文字列で渡されました。
$スケール:小数点後の精度を指定するオプションのパラメーター。
<span><span><span class="hljs-variable">$num1</span></span><span> = </span><span><span class="hljs-string">'123.456789'</span></span><span>;
</span><span><span class="hljs-variable">$num2</span></span><span> = </span><span><span class="hljs-string">'987.654321'</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$num1</span></span><span>, </span><span><span class="hljs-variable">$num2</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>); </span><span><span class="hljs-comment">// 乗算結果は保持されます6位小数</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// 出力 121931.439820</span></span><span>
</span></span>
BCDIV()は、 BCMATH拡張機能の分割関数であり、2つの高精度番号で分割計算を実行するために使用されます。また、結果の精度を確保するために、計算の精度の設定もサポートします。
<span><span><span class="hljs-title function_ invoke__">bcdiv</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$dividend</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$divisor</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$scale</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$配当:配当、文字列として渡されます。
$ divisor :divisor、弦も渡されます。
$スケール:小数点後の精度を指定するオプションのパラメーター。
<span><span><span class="hljs-variable">$num1</span></span><span> = </span><span><span class="hljs-string">'123.456789'</span></span><span>;
</span><span><span class="hljs-variable">$num2</span></span><span> = </span><span><span class="hljs-string">'9.87654321'</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcdiv</span></span><span>(</span><span><span class="hljs-variable">$num1</span></span><span>, </span><span><span class="hljs-variable">$num2</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>); </span><span><span class="hljs-comment">// 分割結果が保持されます6位小数</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// 出力 12.500000</span></span><span>
</span></span>
実際の開発、特に金融分野またはeコマースプラットフォームでは、多くの場合、高精度の価格計算が必要です。製品の総価格、割引価格、税金を計算する必要があるとします。フローティング計算の精度による量エラーを回避するために、 bcmul()とbcdiv()を使用してこれらの操作を処理できます。
製品の単価: 99.99
数量: 10
割引: 0.85 (85%割引)
税率: 0.1 (10%の税率)
アイテムの合計価格、割引価格、および順序の減税後の最終価格を計算します。
<span><span><span class="hljs-comment">// 製品の単価と数量</span></span><span>
</span><span><span class="hljs-variable">$price</span></span><span> = </span><span><span class="hljs-string">'99.99'</span></span><span>;
</span><span><span class="hljs-variable">$quantity</span></span><span> = </span><span><span class="hljs-string">'10'</span></span><span>;
</span><span><span class="hljs-comment">// 製品の総価格を計算します</span></span><span>
</span><span><span class="hljs-variable">$total_price</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$price</span></span><span>, </span><span><span class="hljs-variable">$quantity</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"製品の総価格:<span class="hljs-subst">$total_price</span></span></span><span>\n"; </span><span><span class="hljs-comment">// 出力:製品の総価格:999.90</span></span><span>
</span><span><span class="hljs-comment">// 割引後に価格を計算します</span></span><span>
</span><span><span class="hljs-variable">$discount</span></span><span> = </span><span><span class="hljs-string">'0.85'</span></span><span>;
</span><span><span class="hljs-variable">$discounted_price</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$total_price</span></span><span>, </span><span><span class="hljs-variable">$discount</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"割引後の価格:<span class="hljs-subst">$discounted_price</span></span></span><span>\n"; </span><span><span class="hljs-comment">// 出力:割引後の価格:849.91</span></span><span>
</span><span><span class="hljs-comment">// 税金と手数料を計算します</span></span><span>
</span><span><span class="hljs-variable">$tax_rate</span></span><span> = </span><span><span class="hljs-string">'0.1'</span></span><span>;
</span><span><span class="hljs-variable">$tax</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$discounted_price</span></span><span>, </span><span><span class="hljs-variable">$tax_rate</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"税金:<span class="hljs-subst">$tax</span></span></span><span>\n"; </span><span><span class="hljs-comment">// 出力:税金:84.99</span></span><span>
</span><span><span class="hljs-comment">// 最終価格を計算します(割引後の価格 + 税金)</span></span><span>
</span><span><span class="hljs-variable">$final_price</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcadd</span></span><span>(</span><span><span class="hljs-variable">$discounted_price</span></span><span>, </span><span><span class="hljs-variable">$tax</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最終価格:<span class="hljs-subst">$final_price</span></span></span><span>\n"; </span><span><span class="hljs-comment">// 出力:最終価格:934.90</span></span><span>
</span></span>
複数の分割払い、複利計算などのより複雑な財務計算の場合、 bcmul()とbcdiv()を組み合わせて正確な数学モデルを実装することもできます。計算精度パラメーター(スケール)を合理的に選択することにより、非常に複雑な計算プロセスでさえ、最終結果が正確に保つことができるようにします。
パフォーマンスの考慮事項: BCMATH操作は、文字列に基づいて動作するため、ネイティブPHP操作よりも遅くなります。それにもかかわらず、高精度のコンピューティングは、アプリケーションのシナリオでは必須の必要なものであることが多いため、これらのシナリオではBCMATHを使用する価値があります。
精度の損失を避ける: BCMATHを使用する場合、着信データが適切な精度にフォーマットされていることを常に確認してください。それ以外の場合は、結果に精度エラーがまだある場合があります。
PHPでは、 BCMATH拡張機能は強力な高精度コンピューティング機能を提供します。これは、高精度を必要とするファイナンスや科学的コンピューティングなどのシナリオの処理に特に適しています。 BCMUL()およびBCDIV()関数を介して、高精度の乗算と分割操作を簡単に実装して、計算結果の精度を確保することができます。実際の開発では、フローティング計算エラーを回避するための要件に応じて適切な精度とスケールを設定し、それにより信頼できる結果が得られます。