с плавающей точкой — PHP microtime () преобразование в микросекунды

Я хочу получить секунды и микросекунды в одной переменной с помощью 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?

Благодарю.

1

Решение

Количество цифр отображается в число с плавающей запятой контролируется точность установка в файле 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
3

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

Это получает оба, и я надеюсь, что это то, что вам нужно.

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
echo (float)$sec.''.substr((float)$usec, 1);;
}
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]);
1
По вопросам рекламы [email protected]