gpt4 book ai didi

java - 为什么模运算在 Java VS Perl 中给出不同的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:42 25 4
gpt4 key购买 nike

我在 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

但是当我在 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

为什么最后两次计算会有这样的差异?如何让 perl 匹配 java 结果?

最佳答案

第二种情况:

  • % 在 Java 中对整数和 float 进行运算,
  • % 在 Perl 中只对整数进行运算。

第三种情况:

  • Java 定义模数运算使得以下等式成立:

    dividend == ((int)(dividend/divisor)) * divisor + (dividend % divisor)

    e.g. -1 = 0 * 1000 + -1
  • Perl 定义模数运算使得以下等式成立:

    $dividend == floor($dividend/$divisor) * divisor + ($dividend % $divisor)

    e.g. -1 = -1 * 1000 + 999

Perl 方法的优点是商 (floor($dividend/$divisor)) 将始终与被除数具有相同的符号。


要在 Perl 中获得与 Java 相同的行为,请使用 POSIX::fmod功能。

This is identical to the C function fmod().

$r = fmod($x, $y);

It returns the remainder $r = $x - $n*$y, where $n = trunc($x/$y). The $r has the same sign as $x and magnitude (absolute value) less than the magnitude of $y.

use POSIX 'fmod';

$m1 = fmod(1, 1000); # 1
$m2 = fmod(0.01, 1000); # 0.01
$m3 = fmod(-1, 1000); # -1

关于java - 为什么模运算在 Java VS Perl 中给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com