在 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);
当我运行下面的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);