Отображать значение поплавка без научной нотации
Когда я делаю следующее умножение в PHP:
$ret = 1.0 * 0.000000001;
Я получаю результат: 1.0E-9
Я хочу преобразовать этот результат в стандартную десятичную нотацию, как я могу это сделать?
sprintf('%f',$ret)
не работает, он возвращает 0.000000
. Переполнение?
Ответы
Ответ 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.