Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Bcmul报告0_Php_Bcmath - Fatal编程技术网

Php Bcmul报告0

Php Bcmul报告0,php,bcmath,Php,Bcmath,我有一段简单的代码,如下所示 $amount = 447274.44882; $rate = 0.00001; echo floatNumber(bcmul($amount, $rate, 8), 8); 当其应为4.4727449时,输出0.00000000。如果我将速率更改为0.0001,那么它将输出正确的数字,任何高于4位小数的数字,并报告0 我做错了什么,或者这是一个已知的限制还是什么?如果是这样的话,这似乎是一个很大的问题。如果您使用默认设置将0.00001转换为字符串(如果您使用

我有一段简单的代码,如下所示

$amount = 447274.44882;
$rate = 0.00001;

echo floatNumber(bcmul($amount, $rate, 8), 8);
当其应为4.4727449时,输出0.00000000。如果我将速率更改为0.0001,那么它将输出正确的数字,任何高于4位小数的数字,并报告0


我做错了什么,或者这是一个已知的限制还是什么?如果是这样的话,这似乎是一个很大的问题。

如果您使用默认设置将
0.00001
转换为字符串(如果您使用浮点输入
bcmul
),您将得到以下结果:

var_dump( (string)0.00001 );
字符串(6)“1.0E-5”
虽然没有明确的文档记录,但当遇到无效输入时,bcmath函数显然会将强制转换返回到零:

var_dump( bcadd('Hello', 'world!', 8) );
var_dump( bcadd('33', 'Foo', 8) );
var_dump( bcdiv('33', 'Foo', 8) );
字符串(10)“0.00000000”
字符串(11)“33.00000000”
警告:bcdiv():被零除
无效的
任意精度库的整体思想是克服base 2算法和固定大小存储的限制。因此,您需要:

var_dump( bcmul('447274.44882', '0.00001', 8) );
string(10)“4.4727448”
这是伟大的数学与100位数字,但不是特别有用的简单舍入。事实上,扩展根本不舍入,它只是截断:

字符串(6)“28.894”
字符串(5)“28.89”
串(4)“28.8”
字符串(2)“28”

即使看不到
floatNumber()
的作用:将bcmath与float而不是字符串一起使用完全违背了目的。在这里尝试使用sprintf与您的情况几乎类似吗?我希望它能解决我的舍入错误。我将尝试使用字符串,看看它是否有效。我将其更改为echo sprintf('%f',(bcmul($amount,$rate,8));它仍然是0,也尝试了对字符串进行强制转换,结果也是0。您是否知道
bcmul()
不舍入
bcmul('20.01','1.444','1)
(28.89…)产生
28.8
。这个答案非常详细,谢谢。我仍然不知道即使在字符串之间进行强制转换时使用BCmul是否会导致使用大8位浮点数的计算不准确。由于IEEE浮点精度的工作原理,您可能会得到不准确的计算。但在现实生活中,大多数情况下都是因为舍入的位置不对(或者根本没有舍入)。您可以始终使用整数(例如,美分而不是欧元)。
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) );