Perl 为什么Math::BigInt有错误的输出?

Perl 为什么Math::BigInt有错误的输出?,perl,bigint,Perl,Bigint,我需要获得可被$divisior整除的最接近的数字$new到$orig。$new应大于$orig。因此,我得出了以下公式(希望没有错误): 现在,$orig数字是一个整数,最多有30位数字。我想使用Math::BigInt将其实现到一个Perl函数中,但是输出是非常错误的 使用Math::BigInt; 数学:BigInt->精度(60); 数学:BigInt->precision(60); 我的$orig=Math::BigInt->new('5967920747781284236947735

我需要获得可被
$divisior
整除的最接近的数字
$new
$orig
$new
应大于
$orig
。因此,我得出了以下公式(希望没有错误):

现在,
$orig
数字是一个整数,最多有30位数字。我想使用
Math::BigInt
将其实现到一个Perl函数中,但是输出是非常错误的

使用Math::BigInt;
数学:BigInt->精度(60);
数学:BigInt->precision(60);
我的$orig=Math::BigInt->new('59679207477812842369477355441');#A.
我的$divisor=Math::BigInt->new('719');#B
我的$modulo=$orig->bmod($divisor);#A%B=M
my$diff=$divisor->bsub($modulo);#B-M=D
我的$new=$orig->badd($diff);#A+D=N
我的$test=$new->bdiv($divisor);#不适用=0
打印(“orig:$orig\n”)#10; 应为:5967920747812842369477355441
打印(“模:$modulo\n”);#10; 应该是:648
打印(“diff:$diff\n”)#71; 应该是:71
打印(“新:$new\n”);#10; 应为:5967920747812842369477355512
打印(“测试:$test\n”);#10; 应为:0
:“这些方法修改invocand对象并返回它。”换句话说,
bmod
bsub
badd
类似于
%=
-=
+=
,而不是
%
-
+

因此,无论在何处调用算术方法之一,都应首先进行复制,以便当前调用该方法的对象不会发生更改:

use Math::BigInt;

Math::BigInt->accuracy(60);
Math::BigInt->precision(60);

my $orig = Math::BigInt->new('5967920747812842369477355441');  # A
my $divisor = Math::BigInt->new('719');                        # B
my $modulo = $orig->copy->bmod($divisor);  # A % B = M
my $diff = $divisor->copy->bsub($modulo);  # B - M = D
my $new = $orig->copy->badd($diff);        # A + D = N
my $test = $new->copy->bmod($divisor);     # N % B = 0


print("orig : $orig\n");      # 10; should be: 5967920747812842369477355441
print("modulo : $modulo\n");  # 10; should be: 648
print("diff : $diff\n");      # 71; should be: 71
print("new : $new\n");        # 10; should be: 5967920747812842369477355512
print("test : $test\n");      # 10; should be: 0
(还将您的测试更改为执行模数,而不是除法。)

:“这些方法修改invocand对象并返回它。”换句话说,
bmod
bsub
badd
类似于
%=
-=
+=/code>,而不是
%
-

因此,无论在何处调用算术方法之一,都应首先进行复制,以便当前调用该方法的对象不会发生更改:

use Math::BigInt;

Math::BigInt->accuracy(60);
Math::BigInt->precision(60);

my $orig = Math::BigInt->new('5967920747812842369477355441');  # A
my $divisor = Math::BigInt->new('719');                        # B
my $modulo = $orig->copy->bmod($divisor);  # A % B = M
my $diff = $divisor->copy->bsub($modulo);  # B - M = D
my $new = $orig->copy->badd($diff);        # A + D = N
my $test = $new->copy->bmod($divisor);     # N % B = 0


print("orig : $orig\n");      # 10; should be: 5967920747812842369477355441
print("modulo : $modulo\n");  # 10; should be: 648
print("diff : $diff\n");      # 71; should be: 71
print("new : $new\n");        # 10; should be: 5967920747812842369477355512
print("test : $test\n");      # 10; should be: 0
(还将测试更改为执行模数,而不是除法。)