为什么模运算在Java VS Perl中会产生不同的结果?

goe*_*goe 7 java perl modulo

我在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中的整数进行操作.

第三种情况:

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)


Bat*_*eba 6

Java模运算符可以使用浮点类型,并且还具有如果第一个参数为负则结果将为负的属性.

Perl模运算符仅用于整数类型,结果始终为正数.

如果你希望Perl的行为类似于Java,那么使用适当的乘法将分数缩放到整数,取模数,然后除以得到最终结果.手动补偿负号.虽然您最好自己构建自己的操作员版本.