Алоис Махдал находится на правильном пути , но с трудом работает с изгибами. Вот другое дело по этому вопросу. Мы можем использовать Devel :: Peek, чтобы узнать, что видит Perl в переменной. Perl имеет три базовых (не ссылочных) типа хранения, относящихся к типам C: строки - указатели (PV), а числа могут быть либо поплавками (NV, числовое значение), либо целыми числами (IV).
#!/usr/bin/env perl
use strict;
use warnings;
use Devel::Peek; # Dump
my $x = "1e10";
Dump $x;
выходы
SV = PV(0x1204090) at 0x1225b80
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x1212ac0 "1e10"\0
CUR = 4
LEN = 16
П.В. является строкой. Вы можете увидеть значение. Теперь мы принуждаем к числу, например, добавляя ноль.
...
$x += 0;
Dump $x;
получая
SV = PVNV(0xf018f0) at 0xf21b90
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 10000000000
NV = 10000000000
PV = 0xf0eac0 "1e10"\0
CUR = 4
LEN = 16
Теперь вы можете увидеть, что переменные держать как оригинальный PV и числовое значение (NV) (а также целое число (IV)) составляет 10 млрд. IOK говорит нам, что в настоящее время он считается целым числом. Он сохраняет другие значения в случае, если вы захотите снова принудить вас.
Так вы видите, что принуждение от научного значения к числу так же просто, как преобразование из строки в число (добавление нуля - общий механизм). Чтобы перейти в другую сторону, используйте sprintf
с соответствующим форматом.
N.B. Для полноты мы можем видеть преобразование в NV путем добавления десятичного числа.
...
$x += 0.1;
Dump $x;
выходов
SV = PVNV(0x1ee0910) at 0x1f00b90
REFCNT = 1
FLAGS = (PADMY,NOK,pNOK)
IV = 0
NV = 10000000000.1
PV = 0x1eedac0 "1e10"\0
CUR = 4
LEN = 16
и норвежские кроны говорят Perl, что теперь должно быть значением с плавающей точкой.
Использовать printf с форматом% f? – Barmar
@Barmar so close, 'sprintf' – gaussblurinc
Хотя из заголовка и текста вопроса кажется вполне понятным, что вы спрашиваете, я не вижу, как это относится к фрагменту кода. –