我不知道我在做什么错,但这种计算bcmath时似乎给出了错误的答案,我计算
bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');
回声“83.59999999999999999670”但其它计算器给我83.6。
有没有办法解决这个问题,还是它在bcmath中的缺陷?
我不知道我在做什么错,但这种计算bcmath时似乎给出了错误的答案,我计算
bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');
回声“83.59999999999999999670”但其它计算器给我83.6。
有没有办法解决这个问题,还是它在bcmath中的缺陷?
你看到这个结果的原因是因为你第一个执行划分。
划分为您提供:
422218/2388865
0.17674418604651162790697674418604651163
,但你问数字,这样就显得0.1767441860465116279
。有鉴于此,BC现在给你正确的结果:
0.1767441860465116279*473
83.5999999999999999967
在这种情况下的“解决方案”将首先执行乘法(它给你“只是” 9位数字),然后分工:
bcscale(20);
echo bcdiv(bcmul('422218','473'),'2388865');
83.60000000000000000000
BCMath为您提供确切的结果。如果你需要其他的数字 “形式”,使用功能,如round()
改变它:
http://php.net/manual/en/function.round.php
例如:
echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1);
会给你83.6。
确切的结果是`418/5`或`83.6`。 – Eelvex 2011-02-22 20:18:00
“精确”结果指的是计算机计算出的确切数字 - 正如有人说它具有有限的精度,所以结果也将“有限”。 – 2011-02-22 20:19:25
@TomaszKowalczyk我看到我做错了什么,我很可能会使用类似这样的东西来解决它,在另一个问题中找到一个不错的bcround()函数[link](http://stackoverflow.com/questions/1642614/how我想我会用它来减少我显示的数字的精确度。 – Zzzarka 2011-02-22 20:45:18
bcmath函数使用任意精度算术。这些计算并不是100%准确的 - 它们只是像你所要求的那样精确(你要求20分)。由于计算不准确,你不能总是期望答案是准确的。
你说你的计算器在这种情况下给你正确的答案。但假设它也使用任意精度算术(大部分都是这样),在其他情况下它会给你错误的答案。一些计算器通过以比他们可以显示的更高的精度计算来隐藏它们的不准确性(例如,额外的两位数)。如果您执行一个计算错误,它将最终在显示中可见。
您已经指定了比大多数计算器可以执行的更精确(20位)。所以他们会把它舍去,最有可能的是10或15位数字,给出83.5999 ... 99,这轮到83.6。
这似乎是一个解释的例子。为什么不重新排序操作,或者只是使用普通的PHP浮点运算,如果这是你想要的? – mario 2011-02-22 20:21:27