Чтобы получить первые 15 цифр суммы $a
и $b
, сделайте следующее:
use bigint;
my $a = "99999999999912345"; # works with or without quotes
my $b = "111"; # works with or without quotes
print substr(0 + $a + $b, 0, 15), "\n";
Причина, по которой ваш код не работал должным образом, заключается в том, что Perl выполняет сложение с плавающей запятой для $a + $b
, если оба параметра $a
и $b
являются строками, даже если действует use bigint
. Пример:
use bigint;
print 1234567890123456789 + 2 , "\n"; #: 1234567890123456791
print "1234567890123456789" + 2 , "\n"; #: 1234567890123456791
print 1234567890123456789 + "2", "\n"; #: 1234567890123456791
print "1234567890123456789" + "2", "\n"; #: 1.23456789012346e+18
print 0 + 1234567890123456789 + "2", "\n"; #: 1234567890123456791
Это поведение является причудой в модуле Perl bigint
. Вы можете обойти это, добавив 0 +
(как показано выше), тем самым форсируя добавление bigint вместо добавления с плавающей запятой. Другой обходной путь может быть Math::BigInt->new($a) + $b
вместо 0 + $a + $b
.