perl - int()递减整数

时间:2014-11-13 23:09:52

标签: perl floating-point int integer-arithmetic

在我受到抨击之前,我想说我确实理解浮点数和类似的东西,但这似乎不是我的问题。

为简化起见,我试图确定某个数字是否超过2位小数。我通过将数字乘以100(存储在变量" test1")下然后使用int() ($test2)将其截断并将其与{{1}进行比较来实现此操作}。

if

最初的$test1 = $number * 100; $test2 = int($test1); unless ($test1 == $test2) { die ("test1:$test1, test2:$test2"); } 来自一系列其他函数,实际上只有两位小数,因此我试图捕捉那些不是(&em;)因为一些条目似乎有很多小数)。

但是,我得到了:

$number

来自我的test1:15, test2:14

有人可以解释会发生什么情况吗? die()如何int(15)

3 个答案:

答案 0 :(得分:5)

来自perldoc

  

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

因此," 15"的机器表示可能是14.9999999999999999,因此,int将其截断为14。

请注意,perldoc建议使用POSIX函数floorceil

答案 1 :(得分:0)

在一个简单的,一次性的情况下,在int之前为你的值添加0.5,它将为你提供你想要的东西。

例如

 int(14.99 + 0.5) 
 15 

它变为15.49并且int - ed" down"至15,而:

 int( 14.45 + 0.5 ) 

仍然得到int' ed" down"到14.0。这是一个方便的技巧,但并不像使用floorceil一样自我记录。

作为旁注,Goldberg paper on floating point arithmetic总是提醒我,有时候脑子不像计算机一样精确无比精确:-)

答案 2 :(得分:0)

如果我想检查一个数字是否超过两位小数,我就不会对它进行数学计算。

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

在我这样做之前,我可能会使用Scalar::Util' looks_like_a_number。如果您期望14.99999为15.0,则此方法仍会因浮点松软而失败。

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

关于int的问题,我认为documentation告诉您需要了解的内容。其余部分在perlfaq4的前几个问题中得到解答。