如果我确实在 substr 中使用了一个大整数:
use BigInt;
$acct_hash = substr(('99999999999912345' + $data[1]),0,15);
为什么结果还在9.9999999999912
?
我期待着999999999999912
。有没有类似的东西:
$data[1] = substr(to_char('999999999999991234'),0,15);
在 Perl 中?
要获得 和 和的前 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
if both $a
and $b
are 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
.
我认为您遇到的是字符串解释的问题。试试这个代码:
use bigint;
print(99999999999912345 + 99999999999912345, "\n");
并将其与非常相似的内容进行比较:
use bigint;
print('99999999999912345' + '99999999999912345', "\n");
在您的数字周围使用单引号会将它们变成字符串,并且似乎可以绕过bigint
.