在 Perl 中,为什么 100*18.35 不等于 1835?

In Perl, why does 100*18.35 not compare equal to 1835?

当我运行下面的Perl一行:

$ perl -e 'print "Oh no!\n" unless 1835 == 100*18.35'

我明白了

Oh no!

这是为什么?

你错过的是一个老计算机科学问题 - 浮点数转换。

你看,你不能精确地将“0.35”表示为浮点数,因为它是二进制的周期数。

因此,如果您添加:

my $new = $a->{a} - $b;
print $new;

您将获得:

2.27373675443232e-013

$a->{a} $b 稍微多一点,因此测试 是正确的。

如果您满足以下条件,就可以在工作中看到这一点:

my $new_val = 18.35 - 18;
print $new_val;

尽管我们正在使用它 - 不要使用 $a$b - 它们是为 sort 保留的。无论如何,单个字母的 var 名称都不是好的风格。

此外 my $a = {}; 是多余的 - 没有必要像这样初始化一个空的散列引用。

做你想做的,然后你要么需要比较 'like types' 要么显式转换为整数:

$a->{a} = int(18.35 * 100);