substr で大きな整数を使用する場合:
use BigInt;
$acct_hash = substr(('99999999999912345' + $data[1]),0,15);
なぜ結果はまだ9.9999999999912
ですか?
私は期待してい999999999999912
た。次のようなものがありますか:
$data[1] = substr(to_char('999999999999991234'),0,15);
パールで?
$a
との合計の最初の15桁を取得するには、次の$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
この振る舞いはPerlbigint
モジュールの癖です。0 +
(上記のように)を前に付けることで回避できます。したがって、浮動小数点の加算ではなく、bigintの加算を強制します。Math::BigInt->new($a) + $b
別の回避策は、の代わりにすることができます0 + $a + $b
。
あなたが遭遇しているのは、文字列の解釈に関する問題だと思います。このコードを試してください:
use bigint;
print(99999999999912345 + 99999999999912345, "\n");
そして、それを非常によく似たものと比較してください:
use bigint;
print('99999999999912345' + '99999999999912345', "\n");
数値を一重引用符で囲むと、数値が文字列に変換され、回避できるようbigint
です。