【问题标题】:Why does Math::BigInt has wrong output?为什么 Math::BigInt 输出错误?
【发布时间】:2020-06-13 02:39:06
【问题描述】:

我需要得到最接近的数字 $new 到 $orig 可被 $divisor 整除。 $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 : $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

【问题讨论】:

    标签: perl bigint


    【解决方案1】:

    https://metacpan.org/pod/Math::BigInt#Arithmetic-methods : "这些方法修改调用对象并返回它。"换言之,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
    

    (还将您的测试更改为模数,而不是除法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 2021-10-28
      • 2015-04-12
      • 2012-11-29
      • 1970-01-01
      • 2020-12-24
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多