$x = 123.456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 1.23456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.00000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
Вывод:
123.45
1.23
0.0123
0.0000123
0.000000123
0.00000000123
В основном это всегда содержит минимум 2 десятичных цифры до 3 значащих цифр.
Однако из-за способа обработки плавающей запятой внутри(как сила 2, а не 10), есть некоторые уловы.Числа типа 0.1
и 0.001
и т. Д. Не могут быть сохранены точно, поэтому они на самом деле хранятся как 0.09999999...
или тому подобное.В таких случаях может показаться, что он неправильно вычисляет вещи и дает вам ответы с более значительными цифрами, чем следовало бы.
Вы можете попытаться противодействовать этому явлению, допустив предел ошибки для формулы:
number_format($x, max(2, 3 - ceil(log10(abs($x))) - 1e-8))
Но это может вызвать другие нежелательные эффекты.Вам придется делать тесты.