何が間違っているのかわかりませんが、この計算は
bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');
「83.59999999999999999670」をエコーしますが、他のすべての電卓は83.6を返します。
これを解決する方法はありますか、それとも bcmath の欠陥ですか?
この結果が表示されるのは、最初に除算を実行したためです。
部門はあなたに与えます:
422218/2388865
0.17674418604651162790697674418604651163
しかし、あなたは20桁を要求するので、それは になり0.1767441860465116279
ます。その観点から、bc は正しい結果を提供します。
0.1767441860465116279*473
83.5999999999999999967
この場合の「解決策」は、最初に乗算を実行し(これにより「ちょうど」9桁になります)、次に除算を実行することです。
bcscale(20);
echo bcdiv(bcmul('422218','473'),'2388865');
83.60000000000000000000
bcmath関数は、任意精度の算術を使用します。計算は100%正確ではありません-あなたが要求するのと同じくらい正確です(あなたはスケール20を要求しました)。計算は正確ではないため、答えが正確であると常に期待できるとは限りません。
この場合、電卓が正しい答えを出すとあなたは言います。ただし、任意精度の算術演算も使用していると仮定すると(ほとんどの場合)、他の場合には間違った答えが返されます。一部の計算機は、表示できるよりも高い精度(たとえば、余分な2桁)で計算することにより、不正確さを隠します。エラーが発生する場所で計算を実行すると、最終的にはディスプレイに表示されます。
ほとんどの電卓が実行できるよりも高い精度(20桁)を指定しました。したがって、10桁または15桁に丸められ、83.5999 ... 99になり、83.6に丸められます。
BCMath は正確な結果を提供します。他の数値「形式」が必要な場合は、次のような関数を使用round()
して変更します。
http://php.net/manual/en/function.round.php
例えば:
echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1);
あなたに83.6を与えるでしょう。