-3

我正在为一个小测试项目生成一些数据,并使用我的旧备用 perl。我发现当我将 0.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 bug 以来我见过的最奇怪的事情,我似乎找不到任何关于这个的讨论。我错过了什么还是有什么问题?

4

1 回答 1

10

小数部分0.1不能以 2 为基数表示,就像分数 ⅓ 不能以 10 为基数表示(0.33333...)。如果您将 0 到 3 的数字相加,步长为 ⅓,精度为两位数,我们将得到2.97答案。这类似于将分数表示为浮点数的问题。

无论您的浮点数有多大(使用多少个十进制数字),这些问题都不会消失。要解决这些问题,请在内部使用适当的整数,并在您必须与其他代码/外部世界(如

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