1

何が間違っているのかわかりませんが、この計算は

bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');

「83.59999999999999999670」をエコーし​​ますが、他のすべての電卓は83.6を返します。

これを解決する方法はありますか、それとも bcmath の欠陥ですか?

4

4 に答える 4

5

この結果が表示されるのは、最初に除算を実行したためです。

部門はあなたに与えます:

422218/2388865
0.17674418604651162790697674418604651163

しかし、あなたは20桁を要求するので、それは になり0.1767441860465116279ます。その観点から、bc は正しい結果を提供します。

0.1767441860465116279*473
83.5999999999999999967

この場合の「解決策」は、最初に乗算を実行し(これにより「ちょうど」9桁になります)、次に除算を実行することです。

bcscale(20);
echo bcdiv(bcmul('422218','473'),'2388865');
83.60000000000000000000
于 2011-02-22T20:25:38.133 に答える
1

bcmath関数は、任意精度の算術を使用します。計算は100%正確ではありません-あなたが要求するのと同じくらい正確です(あなたはスケール20を要求しました)。計算は正確ではないため、答えが正確であると常に期待できるとは限りません。

この場合、電卓が正しい答えを出すとあなたは言います。ただし、任意精度の算術演算も使用していると仮定すると(ほとんどの場合)、他の場合には間違った答えが返されます。一部の計算機は、表示できるよりも高い精度(たとえば、余分な2桁)で計算することにより、不正確さを隠します。エラーが発生する場所で計算を実行すると、最終的にはディスプレイに表示されます。

于 2011-02-22T20:16:51.173 に答える
0

ほとんどの電卓が実行できるよりも高い精度(20桁)を指定しました。したがって、10桁または15桁に丸められ、83.5999 ... 99になり、83.6に丸められます。

于 2011-02-22T20:17:30.937 に答える
0

BCMath は正確な結果を提供します。他の数値「形式」が必要な場合は、次のような関数を使用round()して変更します。

http://php.net/manual/en/function.round.php

例えば:

echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1);

あなたに83.6を与えるでしょう。

于 2011-02-22T20:15:49.053 に答える