bcmath似乎对我的计算给出了错误的答案

时间:2011-02-22 20:12:53

标签: php bcmath

我不确定我做错了什么但这个计算

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

回应“83.59999999999999999670”,但每个其他计算器给我83.6。

有没有办法解决这个问题,还是bcmath的缺陷?

4 个答案:

答案 0 :(得分:4)

您看到此结果的原因是因为您首先执行除法。

该师给你:

422218/2388865
0.17674418604651162790697674418604651163

但是您要求 20 数字,因此它变为0.1767441860465116279。在这种情况下,bc现在给你正确的结果:

0.1767441860465116279*473
83.5999999999999999967

“解决方案”在这种情况下首先执行乘法(它给你“只”9位数),然后是除法:

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

答案 1 :(得分:1)

bcmath函数使用任意精度算术。计算不是100%精确 - 它们只是你要求的精确度(你要求比例20)。由于计算不准确,你不能总是期望答案是准确的。

你说你的计算器在这种情况下给你正确答案。但假设它也使用任意精度算术(大多数都是),在其他情况下会给你错误的答案。有些计算器通过精确计算隐藏它们的不准确性(例如额外的两位数)。如果您执行错误累积的计算,它最终将在显示中显示。

答案 2 :(得分:0)

BCMath为您提供准确的结果。如果您需要其他号码“表单”,请使用round()之类的功能进行更改:

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

例如:

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

会给你83.6。

答案 3 :(得分:0)

您指定的精确度(20位数)比大多数计算器都要高。所以他们会把它四舍五入,最有可能是10或15位数,给出83.5999 ... 99,这个数字是83.6。