Когда я делаю следующее умножение в PHP:
$ret = 1.0 * 0.000000001;
я получаю результат: 1.0E-9
Я хочу преобразовать этот результат в стандартную десятичную нотацию, как я могу это сделать?
sprintf('%f',$ret)
не работает, он возвращает 0.000000
. Переполнение?
sprintf('%f',$ret)
не работает, он возвращает0.000000
. Переполнение?
sprintf
работает, однако вы пропустите какой-то момент здесь.
0.000000
не переполняется. Просто sprintf
для модификатора %f
использует по 6 цифр по умолчанию. Также обратите внимание, что %f
является локальным, %F
, вероятно, лучше подходит.
Вы можете использовать больше цифр, например, скажем, 4 000 000 (четыре миллиона):
$ php -r "printf('%.4000000F', 1*0.000000001);" Notice: printf(): Requested precision of 4000000 digits was truncated to PHP maximum of 53 digits in Command line code on line 1 Call Stack: 0.0001 319080 1. {main}() Command line code:0 0.0001 319200 2. printf() Command line code:1 0.00000000100000000000000006228159145777985641889706869
Как показывает этот пример, существует не только общее значение (6 цифр), но и максимум (вероятно, это зависит от компьютерной системы PHP), здесь усечено до 53 цифр в моем случае, как показывает предупреждение.
Из-за вашего вопроса, который я бы сказал, вы хотите отобразить:
0.000000001
Это девять цифр, поэтому вам нужно написать так:
sprintf('%.9F',$ret)
Однако вы можете сделать это:
rtrim(sprintf('%.20F', $ret), '0');
который впоследствии удалит нули справа:
0.000000001
Надеюсь, это полезно.
Вам нужно добавить спецификатор точности (сколько десятичных цифр должно отображаться для чисел с плавающей запятой). Что-то вроде этого:
echo sprintf('%.10f',$ret); // 0.0000000010
Если вы не знаете, какой номер вы должны указать, просто дайте ему большое количество и объедините его с rtrim()
.
echo rtrim(sprintf('%.20f', $ret), '0'); // 0.000000001
Приведенный выше код будет удалять любые 0
из конца строки.
Я предлагаю использовать BCMath для большей точности, когда вы вычисляете десятичные числа. Это гарантирует, что вы действительно получите желаемые результаты.
Чтобы напечатать то, что вы хотите, вы должны указать точность и использовать %.9f
, так как по умолчанию она отображает 6 десятичных чисел. Это делает что-то вроде этого (как уже сказал bsdnoobz):
sprintf('%.9f',$ret);
Чтобы выровнять настройки и ограничения вашей системы, вы можете использовать serialize_precision
чтобы получить максимально точный результат.
echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret));
Я не рекомендую использовать неопределенный %F
поскольку ваш вопрос имеет смысл только для показа. Уважение к языку делает лучший UX.