如果我在substr中使用大整数:
use BigInt;
$acct_hash = substr(('99999999999912345' + $data[1]),0,15);
为什么结果仍为9.9999999999912
?
我期待999999999999912
。是否有类似的东西:
$data[1] = substr(to_char('999999999999991234'),0,15);
在Perl中?
答案 0 :(得分:3)
要获取$a
和$b
之和的前15位数,请执行以下操作:
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";
如果$a + $b
和$a
都是字符串,Perl会为$b
执行浮点加法,即使{{1}有效。例如:
use bigint
这种行为在Perl 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
模块中是一个怪癖。你可以通过预先加bigint
(如上所示)来处理它,从而强制添加bigint而不是浮点加法。另一种解决方法可以是0 +
,而不是Math::BigInt->new($a) + $b
。
答案 1 :(得分:2)
我认为你遇到的是字符串解释的问题。试试这段代码:
use bigint;
print(99999999999912345 + 99999999999912345, "\n");
并将其与非常相似的方式进行比较:
use bigint;
print('99999999999912345' + '99999999999912345', "\n");
在数字周围使用单引号将其转换为字符串,似乎可以绕过bigint
。