bcmath, кажется, дает неправильный ответ на мой расчет - PullRequest
1 голос
/ 22 февраля 2011

Я не уверен, что я делаю неправильно, но этот расчет

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

повторяет "83.59999999999999999670", но любой другой калькулятор дает мне 83,6.

Есть ли способ решить эту проблему или это ошибка в bcmath?

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

Причина, по которой вы видите этот результат, заключается в том, что вы сначала выполняете деление.

Деление дает вам:

422218/2388865
0.17674418604651162790697674418604651163

, но вы запрашиваете 20 цифр, так что становится 0.1767441860465116279.В этом свете bc теперь дает правильный результат:

0.1767441860465116279*473
83.5999999999999999967

A «решение» в этом случае будет сначала выполнить умножение (которое дает «всего» 9 цифр) а затем деление:

bcscale(20);
echo bcdiv(bcmul('422218','473'),'2388865');
83.60000000000000000000
1 голос
/ 22 февраля 2011

Функции bcmath используют произвольную точность арифметики. Расчеты не на 100% точны - они настолько точны, насколько вы просите (вы просили шкалу 20). Поскольку расчеты не точны, вы не всегда можете ожидать точного ответа.

Вы говорите, что ваш калькулятор дает вам правильный ответ в этом случае. Но если предположить, что он также использует арифметику произвольной точности (большинство так и делает), то в других случаях он даст вам неправильный ответ. Некоторые калькуляторы скрывают свою неточность, вычисляя с большей точностью, чем они могут отобразить (например, дополнительные две цифры). Если вы выполните вычисление, в котором накапливается ошибка, она в конечном итоге станет видимой на дисплее.

0 голосов
/ 22 февраля 2011

Вы указали больше точности (20 цифр), чем может выдержать большинство калькуляторов. Таким образом, они округляют его, скорее всего, до 10 или 15 цифр, давая 83,5999 ... 99, что округляет до 83,6.

0 голосов
/ 22 февраля 2011

BCMath дает вам точный результат.Если вам нужна другая «форма» числа, используйте такие функции, как round(), чтобы изменить ее:

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

Например:

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

Даст вам 83,6.

...