为什么Math::BigInt输出错误



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

$new = $orig + ($divisor - $orig % $divisor)

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

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->bmod($divisor);  # A % B = M
my $diff = $divisor->bsub($modulo);  # B - M = D
my $new = $orig->badd($diff);        # A + D = N
my $test = $new->bdiv($divisor);     # N / B = 0

print("orig : $orign");      # 10; should be: 5967920747812842369477355441
print("modulo : $modulon");  # 10; should be: 648
print("diff : $diffn");      # 71; should be: 71
print("new : $newn");        # 10; should be: 5967920747812842369477355512
print("test : $testn");      # 10; should be: 0

https://metacpan.org/pod/Math::BigInt#Arithmetic-methods:"这些方法修改invocand对象并返回它。"换句话说,bmodbsubbadd类似于%=-=+=,而不是%-+

因此,在任何调用算术方法的地方,都应该首先复制,这样您当前调用该方法的对象就不会改变:

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 : $orign");      # 10; should be: 5967920747812842369477355441
print("modulo : $modulon");  # 10; should be: 648
print("diff : $diffn");      # 71; should be: 71
print("new : $newn");        # 10; should be: 5967920747812842369477355512
print("test : $testn");      # 10; should be: 0

(还将你的测试改为做模数,而不是除法。(

相关内容

最新更新