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

如果您使用默认设置强制转换为字符串(如果您使用浮点数提供,因为它需要字符串0.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 回答