1

substr で大きな整数を使用する場合:

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

なぜ結果はまだ9.9999999999912ですか?

私は期待してい999999999999912た。次のようなものがありますか:

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

パールで?

4

2 に答える 2

3

$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$buse 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

于 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 に答える