3

以下のような簡単なコードがあります。

$amount = 447274.44882;
$rate = 0.00001;

echo floatNumber(bcmul($amount, $rate, 8), 8);

これは、4.47274449 であるはずのときに 0.00000000 を出力します。レートを 0.0001 に変更すると、小数点以下 4 桁を超える正しい数値が出力され、0 が報告されます。

私は何か間違ったことをしていますか、それとも既知の制限か何かですか? だとするとかなり大きいようです。

4

1 に答える 1

4

デフォルト設定を使用して stringにキャストすると ( stringsが必要なため、float0.00001をフィードした場合にこれが発生します)、次のようになります。bcmul

var_dump( (string)0.00001 );
string(6) "1.0E-5"

明確に文書化されていませんが、 bcmath は明らかに機能します戻る無効な入力に直面したときにゼロにキャスト:

var_dump( bcadd('Hello', 'world!', 8) );
var_dump( bcadd('33', 'Foo', 8) );
var_dump( bcdiv('33', 'Foo', 8) );
string(10) "0.00000000"
string(11) "33.00000000"
Warning: bcdiv(): Division by zero
NULL

任意精度ライブラリの全体的なアイデアは、基数 2 の算術および固定サイズのストレージの制限を克服することです。したがって、これが必要になります:

var_dump( bcmul('447274.44882', '0.00001', 8) );
string(10) "4.47274448"

これは、100 桁の数値を計算するには最適ですが、単純な丸めには特に役立ちません。実際、この拡張機能はまったく丸めず、切り捨てるだけです。

var_dump( bcmul('20.01', '1.444', 3) );
var_dump( bcmul('20.01', '1.444', 2) );
var_dump( bcmul('20.01', '1.444', 1) );
var_dump( bcmul('20.01', '1.444', 0) );
string(6) "28.894"
string(5) "28.89"
string(4) "28.8"
string(2) "28"
于 2014-02-06T17:09:06.053 に答える