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

时间:2017-05-04 14:05:58

标签: perl floating-point floating-point-comparison

当我运行以下Perl单线程时:

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

我得到了

Oh no!

为什么?

1 个答案:

答案 0 :(得分:7)

你缺少的是一个旧的计算机科学问题 - 浮点转换。

你知道,你不能准确代表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 = {};是多余的 - 没有必要像这样初始化空哈希引用。

要做你想做的事,那么你要么需要比较类型'或显式转换为整数:

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