perl-int()递减整数

perl-int()递减整数,perl,floating-point,int,integer-arithmetic,Perl,Floating Point,Int,Integer Arithmetic,在我被激怒之前,我想说我确实理解浮点数之类的东西,但这似乎不是我的问题 为了简化事情,我试图确定一个数字是否有超过2个小数位。我将这个数字乘以100(存储在变量“test1”),然后用int()($test2)截断它,并将其与if进行比较 $test1 = $number * 100; $test2 = int($test1); unless ($test1 == $test2) { die ("test1:$test1, test2:$test2"); } 最初的$number来自一系列

在我被激怒之前,我想说我确实理解浮点数之类的东西,但这似乎不是我的问题

为了简化事情,我试图确定一个数字是否有超过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
从我的
模具()

有人能解释一下这是怎么发生的吗?
int(15)
如何成为
14

来自:

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

因此,“15”的机器表示可能类似于14.9999999999999,因此,
int
将其截断为14


请注意,perldoc建议改用POSIX函数
floor
ceil

在一个简单、一次性的情况下,在
int
-ing之前向您的值添加0.5,它将为您提供所需的值

e、 g

它变为
15.49
,并且
int
-ed“down”为
15
,而:

 int( 14.45 + 0.5 ) 
仍然将
int
“向下”设置为
14.0
。这是一个很方便的技巧,但没有使用
floor
ceil
来很好地自我记录


顺便说一句,这句话总是提醒我,有时大脑不如计算机那么精确是多么有用:-)

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

my $more_than_two = $number =~ /\d+\.\d{2}\d+\z/;
在我这么做之前,我可能会使用“s
looks\u like\u a\u number”
。如果您预期14.99999为15.0,则此方法仍将因浮点压缩而失败

然而,你应该告诉我们你正在尝试做什么,而不是你是如何尝试去做的。给出更好的答案更容易


对于您关于
int
的问题,我认为这是告诉您需要知道的。剩下的问题在中的前几个问题中得到了回答。

perl-wE'$foo=14.9999999999;比如$foo;说int$foo'
die(sprintf(“test1:%.20g,test2:%.20g”,“test1,$test2”)
my $more_than_two = $number =~ /\d+\.\d{2}\d+\z/;