2011-12-21 75 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