Perl:如何比较浮点数

时间:2014-02-05 20:21:36

标签: perl floating-point

我编写了以下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

4 个答案:

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