2011-12-21 42 views
4

我在Perl中有一个包含小数字的字符串: $ num =“0.00000001”;如何在Perl中将指数数字格式更改为浮点格式

当我对它进行数字操作时,它变成指数格式的数字: $ num = $ num * 100; print“$ num \ n”;

结果是:1E-06

问题是, 如何得到这个数目在浮点格式打印,即0.000001。

我知道我可以用的sprintf(“%。1207米”,$ NUM), 做了具体的数字,但我希望有一个通用的解决方案, 所以我不会每次都要确定如何许多位数(在上述例子的sprintf像6)小数点后 显示

+2

不指定格式规范小数位的数量,即只使用'的sprintf(” %f“,...)' – 2011-12-21 11:13:24

回答

4

使用rodents of unusual size

$ perl -Mbigrat -E'$num = 0.00000001; $num *= 100; say $num' 
0.000001 
+0

使用Perl 5.12,我得到'1/1000000'。使用Perl 5.14,我得到'0.000001'。 – 2011-12-21 11:35:00

+0

发行版是双重存在的。您可以独立升级到0.29,看看它是否有帮助。 – daxim 2011-12-21 11:36:21

5

当您将数字操作$num,就变成一个浮点数。 1e-060.000001是该数字的文字表示;存储的值不区分它们。

如果您只是打印或串化数字,它将使用默认格式,如您所见,结果为"1e-06"。使用格式为"%f"sprintf会给你一个合理的结果; sprintf("%f", $num)收益率为"0.000001"

"%f"格式可能会丢失信息。例如:

$num = "0.00000001"; 
printf("%f\n", $num); 

打印:

0.000000 

你说要,而不必每次多少位数字小数点后显示,以确定打印。 东西必须作出决定,并没有普遍正确的方法来做到这一点。显而易见的事情是只打印有效数字,省略尾随零,但这会带来一些问题。 1.0/3.0打印多少位数,其十进制表示的无限序列为3 s?而0.00000001不能精确的二进制浮点表示:

$num = "0.00000001"; 
printf("%f\n", $num);  
printf("%.78f\n", $num); 

打印:

0.000000 
0.000000010000000000000000209225608301284726753266340892878361046314239501953125