int — Простой математический алгоритм PHP возвращает разные результаты при одинаковых входных значениях?

Я не понимаю, как это вообще возможно, результаты ниже противоречат всем моим знаниям программирования.

Я пишу специальную функцию округления, поскольку стандартные функции округления 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?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]