Я хочу получить секунды и микросекунды в одной переменной с помощью microtime (). Если я сделаю это:
$initial_time = microtime();
echo (explode(' ', $initial_time)[1]) . "\n";
echo (explode(' ', $initial_time)[0]) . "\n";
echo (explode(' ', $initial_time)[1]) + (explode(' ', $initial_time)[0]) . "\n";
Я получил:
1419714319
0.05059700
1419714319.0506
Последняя строка такая же, как если бы я назвал microtime (get_as_float) или microtime (true);
Как бы я получил полный результат 1419714319.05059700
вместо 1419714319.0506
?
Благодарю.
Количество цифр отображается в число с плавающей запятой контролируется точность установка в файле PHP.ini. Значение по умолчанию 14
и это именно то количество цифр, которое вы видите ниже:
1419714319.0506 // 10 digits before, 4 after decimal, 14 total
Измените этот параметр на большее число:
ini_set("precision", 20);
$t = microtime(true);
var_dump($t);
// float(1419716734.0712089539)
Обратите внимание, что это только контролирует количество цифр отображается, это не влияет на расчеты.
Сказав все это, вы все равно можете использовать функции форматирования чисел для отображения x количества цифр после десятичной дроби:
$t1 = microtime(true);
echo sprintf("%.20f", $t1); // 1419717225.92410898208618164062
echo number_format($t1, 20, ".", ""); // 1419717225.92410898208618164062
Это получает оба, и я надеюсь, что это то, что вам нужно.
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
echo (float)$sec.''.substr((float)$usec, 1);;
}
Именно так как вы указали, вы, вероятно, не можете (надежно, то есть); значение с плавающей запятой не обязательно представимо.
Внутреннее представление с плавающей точкой будет иметь все свои десятичные дроби, но по умолчанию оно отображается с фиксированным количеством цифр.
Ближайший, который вы можете приехать, использует sprintf
:
$a = 1419714319.05059700;
print "$a\n";
print sprintf("%.8f\n", $a);
будет выводить
1419714319.0506
1419714319.05059695
как видите, будет небольшая ошибка. Конечно, другая возможность состоит в том, чтобы отдельно хранить и обрабатывать целочисленную часть и десятичную часть, возможно, предварительно умножив ее на миллион в качестве своего рода масштабирования:
$not_a_float = implode('.', explode(' 0.', microtime()));
Обратите внимание, что $not_a_float
действительно держит «реальную» стоимость microtime()
, но делает это как строка. Как только вы выполните любую операцию с плавающей запятой для этого значения, он вернется к точности с плавающей точкой и неточность представления вернется.
Вы можете обрабатывать отдельно две части; для временных разниц вы сначала вычисляете разницу между целочисленными частями, затем добавляете вторую десятичную часть, а затем вычитаете первую:
((($after[0]-$before[0])+$after[1])-$before[1])
Скобки гарантируют сохранение неточность до минимума. Тем не менее, обязательно сохраняйте всю возможную обработку после синхронизации, чтобы она не влияла на саму синхронизацию:
$before_raw = microtime();
...
$after_raw = microtime();
$after = explode(' ', $after_raw);
$before = explode(' ', $before_raw);
$diff = ((($after[0]-$before[0])+$after[1])-$before[1]);