Подтвердить что ты не робот

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

Когда я делаю следующее умножение в PHP:

$ret = 1.0 * 0.000000001;

Я получаю результат: 1.0E-9

Я хочу преобразовать этот результат в стандартную десятичную нотацию, как я могу это сделать?

sprintf('%f',$ret) не работает, он возвращает 0.000000. Переполнение?

4b9b3361

Ответ 1

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

Надеюсь, что это будет полезно.

Ответ 2

Вам нужно добавить спецификатор точности (сколько десятичных цифр должно отображаться для чисел с плавающей запятой). Что-то вроде этого:

echo sprintf('%.10f',$ret);  // 0.0000000010

Если вы не знаете, какой номер вы должны указать, просто дайте ему большое количество и объедините его с rtrim().

echo rtrim(sprintf('%.20f', $ret), '0');  // 0.000000001

В приведенном выше коде будет помечен любой 0 из конца строки.

Ответ 3

Я предлагаю использовать BCMath для большей точности при вычислении с десятичными числами. Это гарантирует, что вы действительно получите желаемые результаты.

Чтобы напечатать то, что вы хотите, вы должны указать точность и использовать %.9f, так как по умолчанию она отображает 6 десятичных чисел. Это делает что-то вроде этого (как уже сказал bsdnoobz):

sprintf('%.9f',$ret);

Ответ 4

Чтобы соответствовать вашим системным настройкам и ограничениям, вы можете использовать serialize_precision, чтобы получить наиболее точный результат.

echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret));

Я не рекомендую использовать неязычный %F, поскольку ваш вопрос имеет смысл только для показа. Уважение к языку делает лучший UX.