我不确定我做错了什么,但这个计算
bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');
回显“83.59999999999999999670”,但其他所有计算器都给我 83.6。
有没有办法解决这个问题,或者它是 bcmath 的一个缺陷?
您看到此结果的原因是因为您首先执行了除法。
该部门为您提供:
422218/2388865
0.17674418604651162790697674418604651163
但你要求20位数字,所以变成0.1767441860465116279
. 鉴于此, bc 现在为您提供正确的结果:
0.1767441860465116279*473
83.5999999999999999967
在这种情况下,一个“解决方案”是首先执行乘法(这给你“只有”9位数字),然后是除法:
bcscale(20);
echo bcdiv(bcmul('422218','473'),'2388865');
83.60000000000000000000
bcmath 函数使用任意精度算术。计算不是 100% 精确的 - 它们只是按照您的要求精确(您要求 20 级)。由于计算不精确,您不能总是期望答案是精确的。
你说你的计算器在这种情况下给了你正确的答案。但是假设它也使用任意精度算术(大多数都使用)它会在其他情况下给你错误的答案。一些计算器通过以比它们显示的更高的精度(例如额外的两位数)进行计算来隐藏它们的不准确性。如果您在错误累积的地方执行计算,它最终会在显示中变得可见。
BCMath 为您提供准确的结果。如果您需要其他数字“形式”,请使用round()
更改它的功能:
http://php.net/manual/en/function.round.php
例如:
echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1);
会给你83.6。
您指定的精度(20 位)超出了大多数计算器的精度。所以他们会四舍五入,最有可能是 10 或 15 位数,给出 83.5999...99,四舍五入为 83.6。