添加错误w / perl

时间:2013-03-24 19:03:27

标签: macos perl

我正在为一个小测试项目生成一些数据并使用我的旧备用,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 bug以来我见过的最奇怪的事情,我似乎无法找到任何关于此的讨论。我错过了什么或者是不是很奇怪?

1 个答案:

答案 0 :(得分:10)

小数部分0.1不能在基数2中表示,很像分数⅓不能用基数10表示(0.33333 ...)。如果你将步数为0的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;
}