Отображать значение поплавка без научной нотации

Когда я делаю следующее умножение в 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.