Я не понимаю, как это вообще возможно, результаты ниже противоречат всем моим знаниям программирования.
Я пишу специальную функцию округления, поскольку стандартные функции округления PHP не соответствуют моим требованиям.
Я извлек часть сложной функции как отдельную функцию special_round2
, который работает, как я и предполагал — просто отлично (пожалуйста, опустите его цель, моя проблема только в математических расчетах).
function special_round2($money, $decimals = 2, $presision = 2) {
//prevent invalid results
if ($decimals > $presision) {
$presision = $decimals;
}
$exponent = pow(10, $presision);
$root_extended = $money * $exponent;
//remove decimals, dont round!!! Just simple cut.
$root_int = (int) $root_extended;
var_dump(gettype($money) . "-" . $presision . "-" . $decimals . "-" . $exponent . ": " . $money . " " . $root_extended . " " . $root_int);
}
special_round2(3842.15);
Когда я запускаю код выше в отдельном файле PHP, результат в порядке:
string(37) "double-2-2-100: 3842.15 384215 384215"
Тем не менее, у меня есть тот же код, реализованный как часть функции в классе. И тот же кусок кода, дает мне разные результаты (на том же входе, тот же сервер, тот же PHP-интерпретация).
Разница лишь в том, что функция static
и иметь один необязательный параметр и его член стандартного класса, но он не является частью вычисления этого куска кода.
public static function round_law($money, $decimals = 2, $presision = 2, $country_iso = self::ISO_CZE) {
//prevent invalid results
if ($decimals > $presision) {
$presision = $decimals;
}
$exponent = pow(10, $presision);
$root_extended = $money * $exponent;
//remove decimals, dont round!!! Just simple cut.
$root_int = (int) $root_extended;
var_dump(gettype($money) . "-" . $presision . "-" . $decimals . "-" . $exponent . ": " . $money . " " . $root_extended . " " . $root_int);
//some other calulation, which should be irrelevant
// ....
Когда я запускаю функцию round_law
один из выводов, который я получил:
string(37) "double-2-2-100: 3842.15 384215 384214"
Обратите внимание, что последний номер дампа в первом случае 384215 во втором случае его 384214 (уменьшается на 1)
Это ошибка PHP? Как я могу отладить это? Я что-то пропустил? Я всегда думал, что копирование алгоритма должно дать мне те же результаты …
Спасибо!
TL; TR
Зачем $root_int = (int) $root_extended;
уменьшать число при вводе того же значения $root_extended
?
Задача ещё не решена.
Других решений пока нет …