Чтобы избежать путаницы на этой странице, на самом деле это лучший ответ, который быстр и работает как для положительных, так и для отрицательных значений $ x:
$frac=($x<0) ? $x-ceil($x) : $x-floor($x);
Я провел тесты скорости 10 миллионов вычислений на PHP 7.2.15, и хотя оба решения дают одинаковые результаты, fmod медленнее, чем floor / ceil.
$frac=($x<0) ? $x-ceil($x) : $x-floor($x);
-> 490-510 мс (в зависимости от знака $ x)
$frac=fmod($x, 1);
-> 590 - 1000 мс (в зависимости от значения $ x)
Принимая во внимание, что сам фактический пустой цикл занимает 80 мс (что включено в приведенные выше значения времени).
Тестовый скрипт:
$x=sqrt(2)-0.41421356237;
$time_start = microtime(true);
for ($i=0;$i<=9999999;$i++) {
//$frac=fmod($x, 1); // version a
$frac=($x<0) ? $x-ceil($x) : $x-floor($x); // version b
}
$time_end = microtime(true);
$time = $time_end - $time_start;