2014-11-13 43 views
2

在我发火之前,我想说我明白浮点数和类似的东西,但这似乎不是我的问题。perl - int()递减一个整数

为了简化事情,我试图确定一个数字是否有超过2个小数位。我将数字乘以100(存储在变量“test1”中),然后用int() ($test2)截断并将其与if进行比较。

$test1 = $number * 100; 
$test2 = int($test1); 
unless ($test1 == $test2) { 
    die ("test1:$test1, test2:$test2"); 
} 

初始$number来自整个系列的其他功能和要切实只有两位小数,所以我想抓住那些没有(如一些条目似乎有很多小数点)。

然而,我刚:

test1:15, test2:14 

从我die()

有人可以解释如何发生? int(15)如何可以14

+0

'perl -wE'$ foo = 14.99999999999999;说$ foo;例如int $ foo'' – ThisSuitIsBlackNot

+0

'die(sprintf(“test1:%。20g,test2:%。20g”,$ test1,$ test2))' – ikegami

回答

5

perldoc

浮点数的机器表示有时会产生直观的结果。例如,int(-6.725/0.025)产生-268而不是正确的-269;那是因为它确实更像-268.99999999999994315658代替

所以,“15”的机器表示是大概就像14.9999999999999999,因此,int它截断至14

注意的perldoc建议使用POSIX代替功能floorceil

0

在一个简单的一次性案例中,在int之前为您的值加上0.5,它会给你想要的。

例如

int(14.99 + 0.5) 
15 

变得15.49int -ed “下降” 到15,而:

int(14.45 + 0.5) 

仍然得到int“编辑 “下” 到14.0。这是一个方便的技巧,但不像使用floorceil那样自我记录。

作为一个侧面说明,Goldberg paper on floating point arithmetic总让我想起它有时是多么有用的是不是盲目精确的:-)

0

计算机如果我要检查,如果数量已超过两个大脑小数位,我不会对它做数学。

my $more_than_two = $number =~ /\d+\.\d{2}\d+\z/; 

我这样做之前,我可能会使用Scalar::Utillooks_like_a_number。如果您预计14.99999为15.0,则此方法仍然会失败并显示浮点。

但是,您应该告诉我们您正在尝试做什么,而不是如何尝试做到这一点。提供更好的答案会更容易。

如果您有任何关于int的问题,我认为它是documentation告诉你你需要知道的。其余的问题在perlfaq4的第一个问题中得到解答。