2012-07-05 136 views
1

比方說,我有一個Perl的變量:在Perl中獲取float的精度?

my $string = "40.23";

my $convert_to_num = $string * 1;

有沒有一種方法,我可以找到這個浮點值的精確度?我的解決方案到目前爲止只是簡單地遍歷字符串,找到'。'的第一個實例,並開始計算多少位小數,在這種情況下返回2。我只是想知道這種事情是否有更優雅或內置的功能。謝謝!

+4

沿着這條道路就是瘋狂。除少數特殊情況外,爲數字的浮點表示賦予小數精度是徒勞的。執行此代碼並重新考慮您的問題:'perl -e'printf「%。* f \ n」,$ _,「40.23」for 14,15,41'' – mob 2012-07-05 18:28:21

+0

我無法無誤地運行該代碼? – lordmarinara 2012-07-05 18:43:49

+0

當我讀到這個問題時,問題不是從存儲爲float或BigFloat的值計算小數位數,而是計算輸入數字中小數點後面出現的數字數。也就是說,一個字符串已被讀取,問題是字符串處理問題,而不是數值計算。那是對的嗎? – 2012-07-05 18:58:55

回答

2

這裏是 「期之後的事情號」 的答案在$ nstring

length(($nstring =~ /\.(.*)/)[0]); 

匹配的部分首先發現。 (\。),然後匹配其他所有內容(。*)。由於。*在括號中,因此返回爲第一個數組元素([0])。然後我用length()函數來計算多少。

+0

感謝您的幫助,這正是我一直在尋找的! – lordmarinara 2012-07-05 22:30:15

2

您在Perl中使用普通變量所做的任何操作都將取決於您使用的編譯器和硬件。如果您真的在意精度,請使用

use "Math::BigFloat"; 

並設置所需的屬性。在Math :: BigFloat中,數字的數量更準確地稱爲精度。

use Math::BigFloat; 

Math::BigFloat->accuracy(12); 
$n = new Math::BigFloat "52.12"; 

print "Accuracy of $n is ", $n->accuracy(), " length ",scalar($n->length()),"\n"; 

將返回

 
Accuracy of 52.1200000000 is 12 length 4 
+0

問題是我無法設置它。我從Excel電子表格中的單元格中讀取數據,只想讀取電子表格中的內容,而不是設置自己的全侷限制。 – lordmarinara 2012-07-05 18:39:10

+0

是什麼讓你無法讀取你的電子表格值並將它們內部存儲爲大浮點數?我認爲這取決於程序員如何處理他從外部收到的數據。 – DavidO 2012-07-05 18:44:01

+0

對,我同意,我正在那樣做。但我還需要存儲的字段之一是有多少個小數位。 – lordmarinara 2012-07-05 18:53:44

相關問題