Вопрос по floating-point, php – Отображать значение с плавающей запятой без научного обозначения

14

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

$ret = 1.0 * 0.000000001;

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

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

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

Ваш Ответ

4   ответа
3

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

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

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

31

sprintf('%f',$ret) doesn't work, it returns 0.000000. Overflow?

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

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

ты босс. искал это по всему интернету.
С помощьюrtrim на вершинеsprintf работает как шарм.
После того, как я нашел этот ответ, я потратил некоторое время на исследования, и этот - лучший ответ там. Вы можете свободно использовать это, ребята.
rtrim(sprintf('%.20F', $ret), '0') вернусь0. если$ret это ноль. Исправьте это так:abs($x) < 1e-20 ? '0' : rtrim(sprintf('%.20f', $x), '0');
7

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

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

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

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

Код выше будет лишать любого0от конца строки.

4

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

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

sprintf('%.9f',$ret);
Проблема в том, что я получаю все эти числа из базы данных с различной точностью. Johni
Тем не менее, когда вы работаете с числами с плавающей запятой, результаты могут отличаться от ожидаемых. Если требуется точность, используйте BCMath. Если вас не волнует, добавлен ли где-нибудь .000000001 (или что-то в этом роде), вы можете использовать float.

Похожие вопросы