为什么我的Perl bigints有小数位?

时间:2009-05-08 21:42:02

标签: perl string bigint

如果我在substr中使用大整数:

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

为什么结果仍为9.9999999999912

我期待999999999999912。是否有类似的东西:

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

2 个答案:

答案 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