我不确定我做错了什么但这个计算
bcscale(20);
echo bcmul(bcdiv('422218', '2388865'), '473');
回应“83.59999999999999999670”,但每个其他计算器给我83.6。
有没有办法解决这个问题,还是bcmath的缺陷?
答案 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。