Как изменить формат экспоненциального числа на формат с плавающей точкой в ​​Perl - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть строка в Perl, которая содержит небольшое число: $ num = "0,00000001";

Когда я выполняю числовую операцию, она становится числом в экспоненциальном формате: $ num = $ num * 100; выведите "$ num \ n";

Результат: 1e-06

Вопрос в том, как распечатать это число в формате с плавающей запятой, т. е. 0,000001.

Я знаю, что могу сделать это для определенного числа с помощью sprintf ("%. 6f", $ num), но я хотел бы иметь общее решение, поэтому мне не нужно будет каждый раз определять, сколько цифр показывать после десятичной точки (как 6 в приведенном выше примере sprintf)

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

Когда вы применяете числовую операцию к $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
4 голосов
/ 21 декабря 2011

Использование грызунов необычного размера :

$ perl -Mbigrat -E'$num = 0.00000001; $num *= 100; say $num'
0.000001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...