在我受到抨击之前,我想说我确实理解浮点数和类似的东西,但这似乎不是我的问题。
为简化起见,我试图确定某个数字是否超过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)
?
答案 0 :(得分:5)
来自perldoc:
浮点数的机器表示有时会产生违反直觉的结果。例如,int(-6.725 / 0.025)产生-268而不是正确的-269;那是因为它真的更像是-268.99999999999994315658
因此," 15"的机器表示可能是14.9999999999999999,因此,int
将其截断为14。
请注意,perldoc建议使用POSIX函数floor
或ceil
。
答案 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
。这是一个方便的技巧,但并不像使用floor
和ceil
一样自我记录。
作为旁注,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的前几个问题中得到解答。