Я создаю простую программу PHP, которая выполняет действие, если (и только если) три случайных числа вычисляются до целого числа. Все случайные числа — это целые числа, созданные с помощью функции rand(). Не вдаваясь в подробности вычисления, важно (с точки зрения моей задачи) то, что оно включает в себя извлечение квадратного корня. Не будучи очень опытным PHP-кодером, единственная функция квадратного корня, которую я знаю, это sqrt(). Проблема в том, что функция sqrt() возвращает число с плавающей запятой, даже если ввод является целым числом, а вывод точен. Я ненадолго подумал о преобразовании вывода в целое число (используя что-то вроде intval(), но это не сработает, потому что все выходные данные будут преобразованы в целые числа, что сделает тест бесполезным! Любые идеи о том, как сделать это? Спасибо,
Функция php sqrt, которая возвращает целое число?
Ответы (5)
Если вы просто хотите определить, является ли это идеальным квадратом, просто определите, является ли
intval(result) * intval(result) == originalValue
Я не знаю php-версию этих функций, но, возможно, вы знаете? :)
original value
является числом с плавающей запятой (неясно из вопроса), поскольку вы не можете надежно сравнивать числа с плавающей запятой с ==
(на любом языке).
- person sleske; 02.03.2011
Это обычная проблема при работе с плавающей запятой. Просто убедитесь, что полученное число с плавающей запятой очень близко к целому числу; обычно это делается путем проверки того, что дробная часть очень мала:
if (abs(round(f)-f))<delta)
# do stuff
Здесь delta
— небольшая константа, например 0,0001. Насколько маленьким он должен быть, зависит от того, насколько вы ожидаете, что ваш результат будет близок к целому числу. Это будет зависеть от ваших расчетов.
Что-то вроде if($result % 1.0 == 0)
может сработать, но у меня нет возможности проверить это прямо сейчас.
%
работает только с целыми числами. Таким образом, $result % 1.0
вернет 0 для любого ввода. Вам нужна функция fmod
(модуль с плавающей запятой). Но даже в этом случае вам не следует сравнивать результат, используя ==
, так как это почти никогда не безопасно делать для чисел fp. См., например. stackoverflow.com/questions/4682889/is-floating-point -все в порядке
- person sleske; 03.03.2011
$result % 1e9
вернет целую часть $result (для отрицательных значений он найдет ячейку результата). Но это хак, поэтому вы можете использовать его только для развлечения.
Это знание из программирования на другом языке, но пытались ли вы умножить выражение на 1. например, если вам нужно было получить целое число чего-то вроде
a = 3.45 * 8;
сделай это
a = 3.45 * 8 * 1;
floor($num)==$num
? Или я что-то упускаю... - person Brad Christie   schedule 02.03.2011==
для поплавков почти всегда (читай: всегда) плохая идея. Сравните с помощью дельты. См., например. stackoverflow.com/questions/4682889/is-floating-point -все в порядке - person sleske   schedule 02.03.2011