999 ... 9是Perl中的真实数字吗?

时间:2009-09-08 10:21:34

标签: perl

sub is_integer {
   defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}

sub is_float {
   defined $_[0] && $_[0] =~ /^[+-]?\d+(\.\d+)?$/;
}

对于上面提到的代码,如果我们将输入设为999999999999999999999999999999999999999999,则输出不是实数。

为什么表现得那样?

我忘了再说一件事:

如果我将$x的此代码用作上述值:

if($x > 0 || $x <= 0 ) {
print "Real";
}

输出为real

这怎么可能?

5 个答案:

答案 0 :(得分:10)

$ perl -e 'print 999999999999999999999999999999999999999999'
1e+42

即。 Perl对此数字使用科学表示,这就是你的正则表达式不匹配的原因。

答案 1 :(得分:7)

使用Scalar::Util中的looks_like_number功能(这是一个核心模块)。

use Scalar::Util qw( looks_like_number );

say "Number" if looks_like_number 999999999999999999999999999999999999999999;

# above prints "Number"

答案 2 :(得分:3)

再添一件事。正如其他人所解释的那样,您使用的数字超出了Perl整数的范围(除非您使用的是140位计算机)。因此,变量将存储为浮点数。正则表达式对字符串起作用因此,在正则表达式对其进行操作之前,该数字将转换为其字符串表示形式。

答案 3 :(得分:2)

其他人已经解释了发生了什么:开箱即用,Perl无法使用科学记数法处理大数字。

如果您需要处理大数字,请查看bignum或其组件,例如Math::BigInt。例如:

use strict;
use warnings;
use Math::BigInt;

my $big_str = '900000000000000000000000000000000000000';
my $big_num = Math::BigInt->new($big_str);

$big_num ++;
print "Is integer: $big_num\n" if is_integer($big_num);

sub is_integer {
   defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}

答案 4 :(得分:1)

另外,您可能需要查看Perl文档中的bignum