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