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 级)。由于计算不精确,您不能总是期望答案是精确的。

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

于 2011-02-22T20:16:51.173 回答
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 回答
0

您指定的精度(20 位)超出了大多数计算器的精度。所以他们会四舍五入,最有可能是 10 或 15 位数,给出 83.5999...99,四舍五入为 83.6。

于 2011-02-22T20:17:30.937 回答