Когда вы применяете числовую операцию к $num
, она становится числом с плавающей запятой. 1e-06
и 0.000001
являются текстовыми представлениями этого числа; сохраненное значение не различает их.
Если вы просто напечатаете или приведете в строку число, он использует формат по умолчанию, который, как вы видели, приводит к "1e-06"
. Использование sprintf
в формате "%f"
даст вам разумный результат; sprintf("%f", $num)
урожайность "0.000001"
.
Но формат "%f"
может потерять информацию. Например:
$num = "0.00000001";
printf("%f\n", $num);
печать:
0.000000
Вы говорите, что хотите напечатать без необходимости каждый раз определять, сколько цифр показывать после десятичной точки. Что-то должно принять это решение, и универсально правильного способа сделать это не существует. Очевидная вещь, которую нужно сделать, это напечатать только значащие цифры, пропуская завершающие нули, но это создает некоторые проблемы. Сколько цифр вы печатаете для 1.0/3.0
, чье десятичное представление имеет бесконечную последовательность 3
с? И 0.00000001
не может быть точно представлено в двоичной форме с плавающей точкой:
$num = "0.00000001";
printf("%f\n", $num);
printf("%.78f\n", $num);
печать:
0.000000
0.000000010000000000000000209225608301284726753266340892878361046314239501953125