1

如果我确实在 substr 中使用了一个大整数:

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

为什么结果还在9.9999999999912

我期待着999999999999912。有没有类似的东西:

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

在 Perl 中?

4

2 回答 2

3

要获得 和 和的前 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 + $bif both $aand $bare strings 进行了浮点加法,即使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

这种行为是 Perlbigint模块中的一个怪癖。您可以通过添加 a 0 +(如上所示)来解决它,从而强制添加 bigint 而不是浮点添加。另一种解决方法可以Math::BigInt->new($a) + $b代替0 + $a + $b.

于 2009-05-08T22:50:07.600 回答
2

我认为您遇到的是字符串解释的问题。试试这个代码:

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

并将其与非常相似的内容进行比较:

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

在您的数字周围使用单引号会将它们变成字符串,并且似乎可以绕过bigint.

于 2009-05-08T22:27:29.540 回答