为什么Perl模运算符使用bignum而不是Math :: BigInt使用大整数?

pac*_*low 1 perl biginteger modulo

我在Perl脚本中尝试了以下内容:

$b = 19999999999999999 % 10000000000000000;
print "$b\n";
Run Code Online (Sandbox Code Playgroud)

它输出错误0.

然后我找到一个答案说使用bignum:

use bignum;
$b = 19999999999999999 % 10000000000000000;
print "$b\n";
Run Code Online (Sandbox Code Playgroud)

它输出正确9999999999999999.

bignum只需将所有整数常量转换为Math :: BigInt.所以我尝试了以下哪些应该与使用相同bignum:

use Math::BigInt;
$b = Math::BigInt->new(19999999999999999) % Math::BigInt->new(10000000000000000);
print "$b\n";
Run Code Online (Sandbox Code Playgroud)

但那输错了0.我在使用Math :: BigInt做错了吗?

mel*_*ene 7

您仍然首先使用本机Perl编号,然后将它们转换为Math::BigInt对象.试试这个:

my $x = Math::BigInt->new('19999999999999999') % Math::BigInt->new('10000000000000000');
Run Code Online (Sandbox Code Playgroud)

引用自perldoc Math::BigInt:

以标量数字给出的输入可能会失去精确度.引用您的输入以确保没有数字丢失:

$x = Math::BigInt->new( 56789012345678901234 );   # bad
$x = Math::BigInt->new('56789012345678901234');   # good
Run Code Online (Sandbox Code Playgroud)

(另外,不要使用$b外部sort和类似的例程.)