2010-11-04 74 views
3

在perl中,我想檢查給定的變量是否包含浮點數。要檢查這個我使用,檢查一個數是int還是浮點數

my $Var = 0.02 # Floating point number 

if (int($Var) != $Var) { 

    # floating point number 
} 

但上面的代碼不會爲0.0工作,

我怎樣才能做到這一點?

+3

什麼正確回答你的問題完全取決於你爲什麼想知道的。你計劃對浮點數有什麼不同? – ysth 2010-11-04 09:18:33

回答

14

這是一個常見問題解答。請參見How do I determine whether a scalar is a number/whole/integer/float?

您也可以使用Scalar::Util::Numeric

有趣的是,

#!/usr/bin/perl 

use strict; use warnings; 
use Scalar::Util::Numeric qw(isint); 

my $x = 0.0; 
print "int\n" if isint $x; 

打印int(如果你看看源代碼並不奇怪),基於@ tchrist的評論,應該可以看的變量結構提供的信息來區分00.0

#!/usr/bin/perl 

use strict; use warnings; 
use Devel::Peek; 

my $x = 0.0; print Dump $x; 
my $y = 0; print Dump $y; 
    $y *= 1.1; print Dump $y; 

輸出:

SV = NV(0x18683cc) at 0x182c0fc 
    REFCNT = 1 
    FLAGS = (PADMY,NOK,pNOK) 
    NV = 0 
SV = IV(0x182c198) at 0x182c19c 
    REFCNT = 1 
    FLAGS = (PADMY,IOK,pIOK) 
    IV = 0 
SV = PVNV(0x397ac) at 0x182c19c 
    REFCNT = 1 
    FLAGS = (PADMY,NOK,pNOK) 
    IV = 0 
    NV = 0 
    PV = 0

在我看來,檢查將不得不看看是否設置了NOK標誌。即使是最簡單的XS也要花費我很長時間,所以我不會提供實現。

+0

你必須尋找是否有NV的獨特IV。 – tchrist 2010-11-04 06:58:57

+1

使用基於glibc的系統,您可以區分:'$ x eq - $ x? 'IV':'NV'' – ysth 2010-11-04 09:17:02

7
($Var - int($Var))?'float':'int' 
+1

警告:這將調用一個字符串「int」。它驗證數字,但不能保證'$ Var'實際上是數字。 – stevesliva 2017-08-09 18:00:00

1

您可以使用自動裝箱::通用模塊,這是autobox的一部分。

#! /usr/bin/perl 

use autobox::universal qw(type); 

my $x = 42; 
print type($x), "\n";; 

$x = 42.0; 
print type($x), "\n"; 

輸出:

INTEGER 
FLOAT