Почему у моих Perl bigints есть десятичное место? - PullRequest
1 голос
/ 09 мая 2009

Если я использую большое число в substr:

use BigInt;
$acct_hash = substr(('99999999999912345' + $data[1]),0,15);

почему результат все еще 9.9999999999912?

Я ожидал 999999999999912. Есть ли что-то вроде:

$data[1] = substr(to_char('999999999999991234'),0,15); 

в Perl?

Ответы [ 2 ]

3 голосов
/ 09 мая 2009

Чтобы получить первые 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.

2 голосов
/ 09 мая 2009

Я думаю, что вы столкнулись с проблемой интерпретации строк. Попробуйте этот код:

use bigint;
print(99999999999912345 + 99999999999912345, "\n");

И сравните это с очень похожим:

use bigint;
print('99999999999912345' + '99999999999912345', "\n");

Использование одинарных кавычек вокруг ваших чисел превращает их в строки, и кажется, что получается около 1007 *

...