在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中负数的情况下的输出是依赖于软件语言的实现.请参阅维基百科:Modulo操作(请查看右表)