理解取模运算符
取模运算符(%)的行为可能会让程序员感到惊讶,因为它通常被误解为提供算术除法操作的余数。本文回顾了取模运算符的行为,并提供了一种算术除法解决方案。
取模运算的“陷阱”
首先,取模是一个整数运算符,如果它接收到分数参数,Perl将只使用分数的整数部分。这意味着以下两个操作是等效的
my $result1 = 5.5 % 3.2;
my $result2 = 5 % 3;
其次,取模运算符执行的是欧几里得除法而不是算术除法。从数学上来说这是预期的,这就是为什么将取模运算符描述为“返回除法操作的余数”可能会让程序员感到惊讶——它不返回小数。例如
my $result3 = 5 / 2; # 2.5
my $result4 = 5 % 2; # 1 (not 0.5)
一些语言(例如Haskell)实现了一个余数函数来提供算术除法的余数:其中5除以2将得到0.5。Perl没有提供这个功能,因此需要编码或从CPAN中找到解决方案。
实现算术余数函数
以下子程序返回算术除法操作的余数。它接受两个参数:被除数($a)和除数($b),并在参数为零或未定义时提前返回。
sub remainder {
my ($a, $b) = @_;
return 0 unless $b && $a;
return $a / $b - int($a / $b);
}
print remainder(5, 2); # 0.5
print remainder(1, 10); # 0.1
print remainder(9, 0); # 0
或者,查看CPAN,Math::Decimal模块提供了一个“dec_rem”子程序(免责声明——我尚未测试它)。
进一步阅读
perldoc有关于取模运算符的条目
本文最初发表在PerlTricks.com上。
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开一个问题或拉取请求来帮助我们。