我在Java 7中运行它,我得到:
double remainder1 = 1 % 1000;
double remainder2 = 0.01 % 1000;
double remainder3 = -1 % 1000;
System.out.println("START: "+remainder1+" | "+remainder2+" | "+remainder3);
>>>START: 1.0 | 0.01 | -1.0
Run Code Online (Sandbox Code Playgroud)
但是当我在Perl 5.8.8中运行相同的操作时,我得到了三分之二的不同结果:
my $remainder1 = 1 % 1000;
my $remainder2 = 0.01 % 1000;
my $remainder3 = -1 % 1000;
print "START: $remainder1 | $remainder2 | $remainder3";
>>>START: 1 | 0 | 999
Run Code Online (Sandbox Code Playgroud)
为什么在最后两次计算中存在这样的差异?如何让perl匹配java结果?
mob*_*mob 10
第二种情况:
%
在Java中对整数和浮点数进行操作,%
只对Perl中的整数进行操作.第三种情况:
Java定义模数运算,使得以下等式成立:
dividend == ((int)(dividend/divisor)) * divisor + (dividend % divisor)
e.g. -1 = 0 * 1000 + -1
Run Code Online (Sandbox Code Playgroud)Perl定义模数运算,使得以下等式成立:
$dividend == floor($dividend/$divisor) * divisor + ($dividend % $divisor)
e.g. -1 = -1 * 1000 + 999
Run Code Online (Sandbox Code Playgroud)Perl方式的优点是商(floor($dividend/$divisor)
)总是与被除数具有相同的符号.
要在Perl中获得与Java相同的行为,请使用该POSIX::fmod
函数.
这与C函数fmod()相同.
$r = fmod($x, $y);
Run Code Online (Sandbox Code Playgroud)
它返回余数
$r = $x - $n*$y
,在哪里$n = trunc($x/$y)
.的$r
具有相同的符号$x
和大小(绝对值)小于的幅度$y
.
use POSIX 'fmod';
$m1 = fmod(1, 1000); # 1
$m2 = fmod(0.01, 1000); # 0.01
$m3 = fmod(-1, 1000); # -1
Run Code Online (Sandbox Code Playgroud)
Java模运算符可以使用浮点类型,并且还具有如果第一个参数为负则结果将为负的属性.
Perl模运算符仅用于整数类型,结果始终为正数.
如果你希望Perl的行为类似于Java,那么使用适当的乘法将分数缩放到整数,取模数,然后除以得到最终结果.手动补偿负号.虽然您最好自己构建自己的操作员版本.