我编写了以下Perl脚本。但是,它不打印" 1"。我做了一些研究,似乎是因为IEEE表示浮点数。那么,有没有更好的方法来比较Perl中的浮点数?
for (my $tmp = 0.1; $tmp <= 1; $tmp+=0.05){print $tmp."\n"}
输出:
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
答案 0 :(得分:9)
使用浮点数的所有计算都可能存在精度错误,如果重复使用结果,那些精确错误就会叠加。从中学到的一件事是永远不要使用float作为循环控制变量。
使用类似
的内容for (my $tmp=2; $tmp<=20; tmp++) {
print $tmp/20.0, "\n";
}
尽你所能。如果你真的需要比较两个浮点数($a, $b)
,比如
if (abs($a - $b) < 0.000001)
是唯一真正有用的东西 - 但是,这也可能会有问题,这取决于差异可以算作真正的差异。
答案 1 :(得分:5)
将所有内容相乘,以便只使用整数 - 在本例中为100。
然后在打印数字时,将其除以相同的数字;
for (my $tmp = 10; $tmp <= 100; $tmp+=5){print $tmp/100 ."\n"}
给我:
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
1
答案 2 :(得分:1)
这是编程中的经典情况,并且很好地解释了here
修复是使用整数运算而是像这样写
for (my $tmp = 10; $tmp <= 100; $tmp += 5) {
print $tmp/100, "\n"
}
<强>输出强>
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
1
答案 3 :(得分:0)
sign=$(perl -E "printf '%.4f', 434.5678 - 2734.4395"); if [ "${sign:0:1}" = "-" ]; then echo -e "434.5678 < 2734.4395\n"; fi
结果:
434.5678 < 2734.4395