在 Perl 中,
%
运算符似乎假定整数。例如:
sub foo {
my $n1 = shift;
my $n2 = shift;
print "perl's mod=" . $n1 % $n2, "\n";
my $res = $n1 / $n2;
my $t = int($res);
print "my div=$t", "\n";
$res = $res - $t;
$res = $res * $n2;
print "my mod=" . $res . "\n\n";
}
foo( 3044.952963, 7.1 );
foo( 3044.952963, -7.1 );
foo( -3044.952963, 7.1 );
foo( -3044.952963, -7.1 );
给予
perl's mod=6
my div=428
my mod=6.15296300000033
perl's mod=-1
my div=-428
my mod=6.15296300000033
perl's mod=1
my div=-428
my mod=-6.15296300000033
perl's mod=-6
my div=428
my mod=-6.15296300000033
现在如您所见,我已经提出了一个用于计算
div
和 mod
的“解决方案”。然而,我不明白的是每个参数的符号应该对结果产生什么影响。作为 div
适合 n2
的次数,n1
不总是正数吗?在这种情况下算术应该如何工作?
标题问一个问题,正文问另一个问题。 为了回答标题问题,就像在 C 中一样,% 运算符是整数模数,但有一个库例程“fmod”是浮点模数。
use POSIX "fmod";
sub foo {
my $n1 = shift;
my $n2 = shift;
print "perl's fmod=" . fmod($n1,$n2), "\n";
my $res = $n1 / $n2;
my $t = int($res);
print "my div=$t", "\n";
$res = $res - $t;
$res = $res * $n2;
print "my mod=" . $res . "\n\n";
}
foo( 3044.952963, 7.1 );
foo( 3044.952963, -7.1 );
foo( -3044.952963, 7.1 );
foo( -3044.952963, -7.1 );
给予
perl's fmod=6.15296300000033
my div=428
my mod=6.15296300000033
perl's fmod=6.15296300000033
my div=-428
my mod=6.15296300000033
perl's fmod=-6.15296300000033
my div=-428
my mod=-6.15296300000033
perl's fmod=-6.15296300000033
my div=428
my mod=-6.15296300000033
给定
a = qd + r
,计算 d
负值的余数时存在歧义。
例如:
表达式
−42 ÷ −5
可以表示为:
−42 = 9×(−5) + 3
或 −42 = 8×(−5) + (−2)
。
所以余数要么是 3,要么是 −2。
更多信息:维基百科:余数“余数满足不等式”
此外,mod / div 中负数的输出取决于软件语言的实现。请参阅维基百科:模运算(看右表)