-3

小さなテスト プロジェクト用のデータを生成していて、古いスタンバイの perl を使用していました。.1 を 0 から 10 に追加すると、6.0 が期待されますが、文字列出力は "5.99999999999999" になります。5.9 から開始すると、8.8 になると同じ部分が失われます: 8.79999999999998。

これは、Mac OS 10.7.5 に同梱されている Perl v5.12.3 と、macports を含むバージョン (v5.12.4) でテストしました。2.2 GHz i7 15 インチ MacBook Pro を使用しています。

for (my $i=0; $i<10; $i+=.1) {
   print $i."\n";
}

古い Pentium のバグ以来、私が見た中で最も奇妙なことであり、これに関する議論を見つけることができないようです。私は何かが欠けているのでしょうか、それとも何かがおかしいのでしょうか?

4

1 に答える 1

10

0.1分数 1/3 が 10 進法 (0.33333...) で表現できないのと同じように、小数分数は 2進法では表現できません。0 から 3 までの数値を 1/3 刻みで、たとえば 2 桁の精度で合計すると、2.97答えが得られます。これは、分数を浮動小数点数として表現する問題に似ています。

float がどれほど大きくても (使用する 10 進数の桁数がいくつであっても)、これらの問題は解消されません。これらの問題を解決するには、内部で適切な整数を使用し、他のコード/外部の世界と通信する必要がある場合はそれらを変換します

for my $i (0 .. 100) {
  say $i/10;
}

またはuse bignum。これは、perl の数値を、任意の精度の数値を表現できるオーバーロードされたオブジェクトに置き換えます:

use bignum;
for (my $i = 0; $ i<= 10; $i += 0.1) {
  say $i;
}
于 2013-03-24T19:27:43.677 に答える