PHP: принимает ли BCMath целые числа?

Безопасно ли использовать переменные типа INT в функциях BCMath в PHP?

Пример:

<?php
$a = 1;
$b = "1";
echo bcadd($a,$b,0);
?>

Кажется, это работает, но безопасно ли это делать? Или, например, существует риск того, что PHP может интерпретировать INT как нечто иное, чем значение int (я думаю о шестнадцатеричных значениях и т. д.)?

Спасибо !


person Vincent Mertens    schedule 13.03.2018    source источник
comment
Ваша тема не соответствует вашему вопросу...   -  person MonkeyZeus    schedule 13.03.2018
comment
Если вы предпочитаете это, вы можете преобразовать свои переменные следующим образом: bcadd((int) $a, (int) $b, 0);   -  person Rod Elias    schedule 13.03.2018
comment
Род Элиас: Я знаю это, но мой вопрос заключается в том, гарантируются ли правильные результаты при передаче INT (либо через INT var, либо путем приведения не INT var) в отличие от STRINGS.   -  person Vincent Mertens    schedule 13.03.2018
comment
функции bc принимают аргументы string и возвращают strings.   -  person AbraCadaver    schedule 13.03.2018
comment
AbraCadaver: конечно, а каких ошибок следует ожидать при передаче INT? Можете ли вы предоставить тестовый пример, в котором результат неверен при передаче нестроковых аргументов? Я знаю, что результатом всегда является строка.   -  person Vincent Mertens    schedule 13.03.2018
comment
MonkeyZeus: похоже, я не могу это изменить :(. Может быть, вы можете поблагодарить вас за ваши cazzilion очков уважения ;) ?   -  person Vincent Mertens    schedule 13.03.2018
comment
Если вы передадите допустимое целое число PHP (или число с плавающей запятой) в bcadd, оно будет работать так же, как если бы вы сначала привели переменную к строке. Он принимает их почти так же, как и любая функция PHP — они просто прозрачно преобразуются с использованием встроенной логики приведения типов.   -  person iainn    schedule 13.03.2018


Ответы (1)


Будьте осторожны с очень большими числами. Если вы присваиваете переменной целое число > PHP_INT_MAX, PHP автоматически преобразует его в число с плавающей запятой. Я знаю, что вы специально спрашивали о целых числах, и в этом случае вы бы передавали число с плавающей запятой, но если вы не знаете об автоматическом преобразовании, похоже, что вы используете большое целое число, поэтому я подумал, что стоит упомянуть.

$a = 9223372036854775808;
$b = '1';

var_dump($b);              // float 9.2233720368548E+18
echo bcadd($a, $b, 0);     // echoes 1

По сути, функция принимает строку. Если вы дадите ему что-то, что не является строкой, PHP автоматически преобразует его в строку, если это возможно, если вы не включили строгий режим.

person Don't Panic    schedule 13.03.2018
comment
Большое спасибо ! Для огромных чисел (> PHP_INT_MAX) я использую строки, мой фактический вопрос заключался в том, нужно ли мне также преобразовывать обычные INT в строки или нет, и вы очистили его: это не требуется. Я могу передать 2 обычных целых числа и потенциально получить строковый результат, который будет > PHP_INT_MAX - person Vincent Mertens; 14.03.2018